saw-go/service/toolService.go

236 lines
6.1 KiB
Go

package service
import (
"StuAcaWorksAI/dao"
"StuAcaWorksAI/proto"
"StuAcaWorksAI/worker"
"encoding/json"
"fmt"
"github.com/golang-jwt/jwt"
"log"
"regexp"
"time"
)
func SetToolRedisList(key string, value string, expire int) (code int, message string) {
if expire == 0 {
if worker.PushRedisList(key, value) {
return proto.SuccessCode, "success"
} else {
return proto.OperationFailed, "push redis list failed"
}
} else if expire > 0 {
if worker.PushRedisListWithExpire(key, value, time.Duration(expire)) {
return proto.SuccessCode, "success"
} else {
return proto.OperationFailed, "push redis list with expire failed"
}
} else {
return proto.ParameterError, "expire time can not be negative"
}
}
func SetToolRedisSet(key string, value string, expire int) (code int, message string) {
if expire == 0 {
if worker.SetRedis(key, value) {
return proto.SuccessCode, "success"
} else {
return proto.OperationFailed, "set redis failed"
}
} else if expire > 0 {
if worker.SetRedisWithExpire(key, value, time.Duration(expire)) {
return proto.SuccessCode, "success"
} else {
return proto.OperationFailed, "set redis with expire failed"
}
} else {
return proto.ParameterError, "expire time can not be negative"
}
}
func SetToolRedisKV(key string, value string, expire int) (code int, message string) {
if expire == 0 {
if worker.SetRedis(key, value) {
return proto.SuccessCode, "success"
} else {
return proto.OperationFailed, "set redis failed"
}
} else if expire > 0 {
if worker.SetRedisWithExpire(key, value, time.Duration(expire)) {
return proto.SuccessCode, "success"
} else {
return proto.OperationFailed, "set redis with expire failed"
}
} else {
return proto.ParameterError, "expire time can not be negative"
}
}
func GetToolRedis(key string) (code int, message string) {
val := worker.GetRedis(key)
if val == "" {
return proto.OperationFailed, "get redis failed"
} else {
return proto.SuccessCode, val
}
}
func GetAllRedis() (code int, msg string, data []worker.RedisInfo) {
data, err := worker.GetAllRedisInfo()
if err != nil {
return proto.OperationFailed, err.Error(), nil
}
return proto.SuccessCode, "success", data
}
func SendEmail(email, subject, body string) {
//捕获异常
defer func() {
if err := recover(); err != nil {
fmt.Errorf("tool send mail error: %s", err)
}
}()
// TODO
// 发送邮件
// 邮件内容
// 邮件标题
// 收件人
// 发送邮件
// 发送邮件通知
// 发送邮件通知
var em worker.MyEmail
em.SmtpPassword = "nihzazdkmucnbhid"
em.SmtpHost = "pop.qq.com:587"
em.SmtpUserName = "354425203@qq.com"
em.SmtpPort = 587
em.ImapPort = 993
err := em.Send(subject, body, []string{email})
if err != nil {
fmt.Println("send mail error:", err)
}
}
// 地址校验
func CheckEmail(email string) bool {
//正则表达式判断是否是邮箱
pattern := `^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+$`
reg := regexp.MustCompile(pattern)
return reg.MatchString(email)
}
// 获取基础信息统计信息
func GetBaseDashboardInfo() proto.DashBoardStatisticsSt {
var res proto.DashBoardStatisticsSt
var err error
res.SessionNum, res.MessageCount, res.TodayMessageCount, err = dao.FindBaseSessionMessageStatisticsInfo()
if err != nil {
log.Println("get base dashboard info error:", err)
}
// 获取用户数
res.UserCount = dao.FindUserNum()
return res
}
// 获取最近7天的消息、会话数量
func GetRecent7DaysMessageSessionCount() (proto.DashBoardStatisticsWeekSt, error) {
var res proto.DashBoardStatisticsWeekSt
SessionCounts, err := dao.FindSessionCountByDate()
if err != nil {
log.Println("get recent 7 days session count error:", err)
return res, err
}
for i := 0; i < len(SessionCounts); i++ {
res.SessionCount = append(res.SessionCount, proto.DashBoardStatisticsWeekCount{Count: SessionCounts[i].Count})
}
MessageCounts, err := dao.FindMessageCountByDate()
if err != nil {
log.Println("get recent 7 days message count error:", err)
return res, err
}
for i := 0; i < len(MessageCounts); i++ {
res.MessageCount = append(res.MessageCount, proto.DashBoardStatisticsWeekCount{Count: MessageCounts[i].Count})
}
return res, nil
}
// 获取模型使用统计
func GetModelUsageStatistics() ([]proto.MessageModelIDCountSt, error) {
m, err := dao.GetAIStreamModelMsgCount()
if err != nil {
log.Println("get model usage statistics error:", err)
return nil, err
}
var res []proto.MessageModelIDCountSt
for _, v := range m {
model := dao.FindModelByModelID(v.ModelID)
if len(model) == 0 {
continue
}
res = append(res, proto.MessageModelIDCountSt{
ModelID: v.ModelID,
ModelName: v.ModelName,
Count: v.Count,
})
}
return res, nil
}
// 定时任务统计dashboard信息保存在redis中
func SetDashboardInfoToRedis() {
//用户统计信息
rbase := GetBaseDashboardInfo()
var resp proto.DashBoardStatisticsResp
//获取最近7天的统计信息
sWeek, _ := GetRecent7DaysMessageSessionCount()
//模型统计信息
modelst, _ := GetModelUsageStatistics()
resp.DashBoardStatisticsSt = rbase
resp.DashBoardStatisticsWeekSt = sWeek
resp.DashBoardStatisticsModelSt = modelst
respStr, err := json.Marshal(resp)
if err != nil {
log.Println("set dashboard info to redis error:", err)
return
}
key := "dashboard_statistics_info"
//将数据存入redis
isSet := worker.SetRedisWithExpire(key, string(respStr), time.Duration(1)*time.Hour)
if !isSet {
log.Println("set dashboard info to redis error")
return
}
}
func DoGithubCallBack(state *proto.ThirdPartyLoginState, code string) {
//获取Access Token
}
// 解析jwt内容
func DecodeJWTToken(tokenStr string) (int, error) {
//解析jwt
// 使用加密secret 解析 JWT 令牌
token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {
return proto.SigningKey, nil
})
if err != nil {
return 0, err
}
// 验证令牌
if !token.Valid {
return 0, fmt.Errorf("invalid token")
}
// 获取用户ID
claims, ok := token.Claims.(jwt.MapClaims)
if !ok {
return 0, fmt.Errorf("invalid token claims")
}
userID, ok := claims["id"].(float64)
if !ok {
return 0, fmt.Errorf("invalid token claims")
}
return int(userID), nil
}