kobe6258 6 days ago
parent
commit
3a7ac8f815

+ 138 - 10
controllers/rag/chat_controller.go

@@ -1,15 +1,19 @@
 package rag
 
 import (
+	"encoding/json"
 	"eta/eta_api/controllers"
 	"eta/eta_api/models"
+	"eta/eta_api/models/llm"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/llm/facade"
 	"eta/eta_api/utils"
 	"eta/eta_api/utils/ws"
+	"fmt"
 	"github.com/gorilla/websocket"
 	"net"
 	"net/http"
+	"strings"
 	"time"
 )
 
@@ -18,16 +22,128 @@ type ChatController struct {
 }
 
 func (cc *ChatController) Prepare() {
-	cc.SysUser = cc.Ctx.Input.GetData("admin").(*system.Admin)
-	if cc.SysUser == nil || cc.SysUser.AdminId == 0 {
-		utils.FileLog.Error("用户信息不存在")
+	method := cc.Ctx.Input.Method()
+	uri := cc.Ctx.Input.URI()
+	if method == "GET" {
+		authorization := cc.Ctx.Input.Header("authorization")
+		if authorization == "" {
+			authorization = cc.Ctx.Input.Header("Authorization")
+		}
+		if strings.Contains(authorization, ";") {
+			authorization = strings.Replace(authorization, ";", "$", 1)
+		}
+		if authorization == "" {
+			strArr := strings.Split(uri, "?")
+			for k, v := range strArr {
+				fmt.Println(k, v)
+			}
+			if len(strArr) > 1 {
+				authorization = strArr[1]
+				authorization = strings.Replace(authorization, "Authorization", "authorization", -1)
+			}
+		}
+		if authorization == "" {
+			utils.FileLog.Error("authorization为空,未授权")
+			cc.Ctx.ResponseWriter.WriteHeader(http.StatusUnauthorized)
+			return
+		}
+		tokenStr := authorization
+		tokenArr := strings.Split(tokenStr, "=")
+		token := tokenArr[1]
+
+		session, err := system.GetSysSessionByToken(token)
+		if err != nil {
+			if utils.IsErrNoRow(err) {
+				utils.FileLog.Error("authorization已过期")
+				cc.Ctx.ResponseWriter.WriteHeader(http.StatusUnauthorized)
+				return
+			}
+			utils.FileLog.Error("authorization查询用户信息失败")
+			cc.Ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
+			return
+		}
+		if session == nil {
+			utils.FileLog.Error("会话不存在")
+			cc.Ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
+			return
+		}
+		//校验token是否合法
+		// JWT校验Token和Account
+		account := utils.MD5(session.UserName)
+		if !utils.CheckToken(account, token) {
+			utils.FileLog.Error("authorization校验不合法")
+			cc.Ctx.ResponseWriter.WriteHeader(http.StatusUnauthorized)
+			return
+		}
+		if time.Now().After(session.ExpiredTime) {
+			utils.FileLog.Error("authorization过期法")
+			cc.Ctx.ResponseWriter.WriteHeader(http.StatusUnauthorized)
+			return
+		}
+		admin, err := system.GetSysUserById(session.SysUserId)
+		if err != nil {
+			if utils.IsErrNoRow(err) {
+				utils.FileLog.Error("权限不够")
+				cc.Ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
+				return
+			}
+			utils.FileLog.Error("获取用户信息失败")
+			cc.Ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
+			return
+		}
+		if admin == nil {
+			utils.FileLog.Error("权限不够")
+			cc.Ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
+			return
+		}
+		//如果不是启用状态
+		if admin.Enabled != 1 {
+			utils.FileLog.Error("用户被禁用")
+			cc.Ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
+			return
+		}
+
+		//接口权限校验
+		roleId := admin.RoleId
+		list, e := system.GetMenuButtonApisByRoleId(roleId)
+		if e != nil {
+			utils.FileLog.Error("接口权限查询出错", e)
+			cc.Ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
+			return
+		}
+		var api string
+		for _, v := range list {
+			if v.Api != "" {
+				api += v.Api + "&"
+			}
+		}
+		api += "&" + models.BusinessConfMap["PublicApi"]
+		//处理uri请求,去除前缀和参数
+		api = strings.TrimRight(api, "&")
+		uri = strings.Replace(uri, "/adminapi", "", 1)
+		uris := strings.Split(uri, "?")
+		uri = uris[0]
+		//fmt.Println("uri:", uri)
+		apis := strings.Split(api, "&")
+		apiMap := make(map[string]bool, 0)
+		for _, s := range apis {
+			apiMap[s] = true
+		}
+		if !apiMap[uri] {
+			utils.FileLog.Error("用户无权访问")
+			cc.Ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
+			return
+		}
+		cc.SysUser = admin
+	} else {
+		utils.FileLog.Error("请求方法类型错误")
 		cc.Ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
 		return
 	}
 }
 
 // NewChat @Title 新建对话框
-// @Description 测试知识库问答
+// @Description 新建对话框
 // @Success 101 {object} response.ListResp
 // @router /chat/new_chat [post]
 func (kbctrl *KbController) NewChat() {
@@ -36,6 +152,13 @@ func (kbctrl *KbController) NewChat() {
 		kbctrl.Data["json"] = br
 		kbctrl.ServeJSON()
 	}()
+	var req facade.LLMKnowledgeSearch
+	err := json.Unmarshal(kbctrl.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
 	sysUser := kbctrl.SysUser
 	if sysUser == nil {
 		br.Msg = "请登录"
@@ -43,12 +166,17 @@ func (kbctrl *KbController) NewChat() {
 		br.Ret = 408
 		return
 	}
-	//searchResp, err := facade.LLMKnowledgeBaseChat(req)
-	//if err != nil {
-	//	br.Msg = "知识库问答"
-	//	br.ErrMsg = "知识库问答:" + err.Error()
-	//	return
-	//}
+	session := llm.UserLlmChat{
+		UserId:      sysUser.AdminId,
+		CreatedTime: time.Now(),
+		ChatTitle:   "新会话",
+	}
+	err = session.CreateChatSession()
+	if err != nil {
+		br.Msg = "创建失败"
+		br.ErrMsg = "创建失败,Err:" + err.Error()
+		return
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "创建成功"

+ 4 - 0
controllers/rag/llm_http/request.go

@@ -5,3 +5,7 @@ type LLMQuestionReq struct {
 	KnowledgeBase string `description:"知识库"`
 	SessionId     string `description:"会话ID"`
 }
+
+type CreateChatReq struct {
+	ChatTitle string `json:"ChatTitle" description:"会话名称"`
+}

+ 21 - 0
models/llm/user_llm_chat.go

@@ -1,4 +1,25 @@
 package llm
 
+import (
+	"eta/eta_api/global"
+	"eta/eta_api/utils"
+	"time"
+)
+
 type UserLlmChat struct {
+	Id          int       `gorm:"primaryKey;autoIncrement;comment:会话主键"`
+	UserId      int       `gorm:"comment:用户id"`
+	ChatTitle   string    `gorm:"comment:会话标题"`
+	IsDeleted   int       `gorm:"comment:是否删除"`
+	CreatedTime time.Time `gorm:"comment:创建时间"`
+	UpdateTime  time.Time `gorm:"autoUpdateTime;comment:更新时间"`
+}
+
+func (u *UserLlmChat) TableName() string {
+	return "user_llm_chat"
+}
+func (u *UserLlmChat) CreateChatSession() (err error) {
+	o := global.DbMap[utils.DbNameAI]
+	err = o.Create(u).Error
+	return
 }

+ 0 - 2
routers/router.go

@@ -40,7 +40,6 @@ import (
 	"eta/eta_api/controllers/smart_report"
 	"eta/eta_api/controllers/speech_recognition"
 	"eta/eta_api/controllers/trade_analysis"
-	"eta/eta_api/services"
 	"github.com/beego/beego/v2/server/web"
 	"github.com/beego/beego/v2/server/web/filter/cors"
 )
@@ -54,7 +53,6 @@ func init() {
 		ExposeHeaders:    []string{"Content-Length", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Content-Type"},
 		AllowCredentials: true,
 	}))
-	web.InsertFilter("/adminapi/llm/chat/connect", web.BeforeRouter, services.WsAuthenticate())
 	ns := web.NewNamespace("/adminapi",
 		web.NSNamespace("/sysuser",
 			web.NSInclude(

+ 122 - 131
services/ws_service.go

@@ -1,142 +1,133 @@
 package services
 
 import (
-	"eta/eta_api/models"
-	"eta/eta_api/models/system"
-	"eta/eta_api/utils"
 	"eta/eta_api/utils/ws"
-	"fmt"
-	"github.com/beego/beego/v2/server/web"
-	"github.com/beego/beego/v2/server/web/context"
-	"net/http"
-	"strings"
-	"time"
 )
 
 var ()
 
-func WsAuthenticate() web.FilterFunc {
-	return func(ctx *context.Context) {
-		method := ctx.Input.Method()
-		uri := ctx.Input.URI()
-		if method == "GET" {
-			authorization := ctx.Input.Header("authorization")
-			if authorization == "" {
-				authorization = ctx.Input.Header("Authorization")
-			}
-			if strings.Contains(authorization, ";") {
-				authorization = strings.Replace(authorization, ";", "$", 1)
-			}
-			if authorization == "" {
-				strArr := strings.Split(uri, "?")
-				for k, v := range strArr {
-					fmt.Println(k, v)
-				}
-				if len(strArr) > 1 {
-					authorization = strArr[1]
-					authorization = strings.Replace(authorization, "Authorization", "authorization", -1)
-				}
-			}
-			if authorization == "" {
-				utils.FileLog.Error("authorization为空,未授权")
-				ctx.ResponseWriter.WriteHeader(http.StatusUnauthorized)
-				return
-			}
-			tokenStr := authorization
-			tokenArr := strings.Split(tokenStr, "=")
-			token := tokenArr[1]
-
-			session, err := system.GetSysSessionByToken(token)
-			if err != nil {
-				if utils.IsErrNoRow(err) {
-					utils.FileLog.Error("authorization已过期")
-					ctx.ResponseWriter.WriteHeader(http.StatusUnauthorized)
-					return
-				}
-				utils.FileLog.Error("authorization查询用户信息失败")
-				ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
-				return
-			}
-			if session == nil {
-				utils.FileLog.Error("会话不存在")
-				ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
-				return
-			}
-			//校验token是否合法
-			// JWT校验Token和Account
-			account := utils.MD5(session.UserName)
-			if !utils.CheckToken(account, token) {
-				utils.FileLog.Error("authorization校验不合法")
-				ctx.ResponseWriter.WriteHeader(http.StatusUnauthorized)
-				return
-			}
-			if time.Now().After(session.ExpiredTime) {
-				utils.FileLog.Error("authorization过期法")
-				ctx.ResponseWriter.WriteHeader(http.StatusUnauthorized)
-				return
-			}
-			admin, err := system.GetSysUserById(session.SysUserId)
-			if err != nil {
-				if utils.IsErrNoRow(err) {
-					utils.FileLog.Error("权限不够")
-					ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
-					return
-				}
-				utils.FileLog.Error("获取用户信息失败")
-				ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
-				return
-			}
-			if admin == nil {
-				utils.FileLog.Error("权限不够")
-				ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
-				return
-			}
-			//如果不是启用状态
-			if admin.Enabled != 1 {
-				utils.FileLog.Error("用户被禁用")
-				ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
-				return
-			}
-
-			//接口权限校验
-			roleId := admin.RoleId
-			list, e := system.GetMenuButtonApisByRoleId(roleId)
-			if e != nil {
-				utils.FileLog.Error("接口权限查询出错", e)
-				ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
-				return
-			}
-			var api string
-			for _, v := range list {
-				if v.Api != "" {
-					api += v.Api + "&"
-				}
-			}
-			api += "&" + models.BusinessConfMap["PublicApi"]
-			//处理uri请求,去除前缀和参数
-			api = strings.TrimRight(api, "&")
-			uri = strings.Replace(uri, "/adminapi", "", 1)
-			uris := strings.Split(uri, "?")
-			uri = uris[0]
-			//fmt.Println("uri:", uri)
-			apis := strings.Split(api, "&")
-			apiMap := make(map[string]bool, 0)
-			for _, s := range apis {
-				apiMap[s] = true
-			}
-			if !apiMap[uri] {
-				utils.FileLog.Error("用户无权访问")
-				ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
-				return
-			}
-			ctx.Input.SetData("admin", admin)
-		} else {
-			utils.FileLog.Error("请求方法类型错误")
-			ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
-			return
-		}
-	}
-}
+//func WsAuthenticate() web.FilterFunc {
+//	return func(ctx *context.Context) {
+//		method := ctx.Input.Method()
+//		uri := ctx.Input.URI()
+//		if method == "GET" {
+//			authorization := ctx.Input.Header("authorization")
+//			if authorization == "" {
+//				authorization = ctx.Input.Header("Authorization")
+//			}
+//			if strings.Contains(authorization, ";") {
+//				authorization = strings.Replace(authorization, ";", "$", 1)
+//			}
+//			if authorization == "" {
+//				strArr := strings.Split(uri, "?")
+//				for k, v := range strArr {
+//					fmt.Println(k, v)
+//				}
+//				if len(strArr) > 1 {
+//					authorization = strArr[1]
+//					authorization = strings.Replace(authorization, "Authorization", "authorization", -1)
+//				}
+//			}
+//			if authorization == "" {
+//				utils.FileLog.Error("authorization为空,未授权")
+//				ctx.ResponseWriter.WriteHeader(http.StatusUnauthorized)
+//				return
+//			}
+//			tokenStr := authorization
+//			tokenArr := strings.Split(tokenStr, "=")
+//			token := tokenArr[1]
+//
+//			session, err := system.GetSysSessionByToken(token)
+//			if err != nil {
+//				if utils.IsErrNoRow(err) {
+//					utils.FileLog.Error("authorization已过期")
+//					ctx.ResponseWriter.WriteHeader(http.StatusUnauthorized)
+//					return
+//				}
+//				utils.FileLog.Error("authorization查询用户信息失败")
+//				ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
+//				return
+//			}
+//			if session == nil {
+//				utils.FileLog.Error("会话不存在")
+//				ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
+//				return
+//			}
+//			//校验token是否合法
+//			// JWT校验Token和Account
+//			account := utils.MD5(session.UserName)
+//			if !utils.CheckToken(account, token) {
+//				utils.FileLog.Error("authorization校验不合法")
+//				ctx.ResponseWriter.WriteHeader(http.StatusUnauthorized)
+//				return
+//			}
+//			if time.Now().After(session.ExpiredTime) {
+//				utils.FileLog.Error("authorization过期法")
+//				ctx.ResponseWriter.WriteHeader(http.StatusUnauthorized)
+//				return
+//			}
+//			admin, err := system.GetSysUserById(session.SysUserId)
+//			if err != nil {
+//				if utils.IsErrNoRow(err) {
+//					utils.FileLog.Error("权限不够")
+//					ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
+//					return
+//				}
+//				utils.FileLog.Error("获取用户信息失败")
+//				ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
+//				return
+//			}
+//			if admin == nil {
+//				utils.FileLog.Error("权限不够")
+//				ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
+//				return
+//			}
+//			//如果不是启用状态
+//			if admin.Enabled != 1 {
+//				utils.FileLog.Error("用户被禁用")
+//				ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
+//				return
+//			}
+//
+//			//接口权限校验
+//			roleId := admin.RoleId
+//			list, e := system.GetMenuButtonApisByRoleId(roleId)
+//			if e != nil {
+//				utils.FileLog.Error("接口权限查询出错", e)
+//				ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
+//				return
+//			}
+//			var api string
+//			for _, v := range list {
+//				if v.Api != "" {
+//					api += v.Api + "&"
+//				}
+//			}
+//			api += "&" + models.BusinessConfMap["PublicApi"]
+//			//处理uri请求,去除前缀和参数
+//			api = strings.TrimRight(api, "&")
+//			uri = strings.Replace(uri, "/adminapi", "", 1)
+//			uris := strings.Split(uri, "?")
+//			uri = uris[0]
+//			//fmt.Println("uri:", uri)
+//			apis := strings.Split(api, "&")
+//			apiMap := make(map[string]bool, 0)
+//			for _, s := range apis {
+//				apiMap[s] = true
+//			}
+//			if !apiMap[uri] {
+//				utils.FileLog.Error("用户无权访问")
+//				ctx.ResponseWriter.WriteHeader(http.StatusForbidden)
+//				return
+//			}
+//			ctx.Input.SetData("admin", admin)
+//		} else {
+//			utils.FileLog.Error("请求方法类型错误")
+//			ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
+//			return
+//		}
+//	}
+//}
 
 func StartSessionManager() {
 	ws.GetInstance().Start()