From 52313fc7f6e5210cf800ddda12d2487d7f105bbb Mon Sep 17 00:00:00 2001 From: GeekMaster Date: Sun, 31 Aug 2025 10:52:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=83=A8=E5=88=86API?= =?UTF-8?q?=E6=8E=88=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/handler/admin/chat_app_handler.go | 16 +++++----- api/handler/admin/chat_handler.go | 24 +++++++------- ...at_role_handler.go => chat_app_handler.go} | 32 +++++++++---------- api/handler/chat_app_type_handler.go | 8 +---- api/handler/chat_handler.go | 4 +-- api/handler/chat_item_handler.go | 6 ++-- api/main.go | 4 +-- api/service/license_service.go | 10 ++++++ api/service/migration_service.go | 21 ++++++------ api/store/model/{chat_role.go => chat_app.go} | 4 +-- api/store/vo/{chat_role.go => chat_app.go} | 2 +- web/src/components/ItemList.vue | 1 - web/src/components/LoginDialog.vue | 14 +++++--- web/src/views/ChatPlus.vue | 8 ++--- web/src/views/mobile/Index.vue | 2 +- web/src/views/mobile/Profile.vue | 24 ++++---------- 16 files changed, 90 insertions(+), 90 deletions(-) rename api/handler/{chat_role_handler.go => chat_app_handler.go} (79%) rename api/store/model/{chat_role.go => chat_app.go} (95%) rename api/store/vo/{chat_role.go => chat_app.go} (96%) diff --git a/api/handler/admin/chat_app_handler.go b/api/handler/admin/chat_app_handler.go index c22cf34b..f2ee1c83 100644 --- a/api/handler/admin/chat_app_handler.go +++ b/api/handler/admin/chat_app_handler.go @@ -48,12 +48,12 @@ func (h *ChatAppHandler) RegisterRoutes() { // Save 创建或者更新某个角色 func (h *ChatAppHandler) Save(c *gin.Context) { - var data vo.ChatRole + var data vo.ChatApp if err := c.ShouldBindJSON(&data); err != nil { resp.ERROR(c, types.InvalidArgs) return } - var role model.ChatRole + var role model.ChatApp err := utils.CopyObject(data, &role) if err != nil { resp.ERROR(c, types.InvalidArgs) @@ -81,8 +81,8 @@ func (h *ChatAppHandler) Save(c *gin.Context) { } func (h *ChatAppHandler) List(c *gin.Context) { - var items []model.ChatRole - var roles = make([]vo.ChatRole, 0) + var items []model.ChatApp + var roles = make([]vo.ChatApp, 0) res := h.DB.Order("sort_num ASC").Find(&items) if res.Error != nil { resp.ERROR(c, "No data found") @@ -123,7 +123,7 @@ func (h *ChatAppHandler) List(c *gin.Context) { } for _, v := range items { - var role vo.ChatRole + var role vo.ChatApp err := utils.CopyObject(v, &role) if err == nil { role.Id = v.Id @@ -151,7 +151,7 @@ func (h *ChatAppHandler) Sort(c *gin.Context) { } for index, id := range data.Ids { - err := h.DB.Model(&model.ChatRole{}).Where("id = ?", id).Update("sort_num", data.Sorts[index]).Error + err := h.DB.Model(&model.ChatApp{}).Where("id = ?", id).Update("sort_num", data.Sorts[index]).Error if err != nil { resp.ERROR(c, err.Error()) return @@ -173,7 +173,7 @@ func (h *ChatAppHandler) Set(c *gin.Context) { return } - err := h.DB.Model(&model.ChatRole{}).Where("id = ?", data.Id).Update(data.Filed, data.Value).Error + err := h.DB.Model(&model.ChatApp{}).Where("id = ?", data.Id).Update(data.Filed, data.Value).Error if err != nil { resp.ERROR(c, err.Error()) return @@ -188,7 +188,7 @@ func (h *ChatAppHandler) Remove(c *gin.Context) { resp.ERROR(c, types.InvalidArgs) return } - res := h.DB.Where("id", id).Delete(&model.ChatRole{}) + res := h.DB.Where("id", id).Delete(&model.ChatApp{}) if res.Error != nil { resp.ERROR(c, "删除失败!") return diff --git a/api/handler/admin/chat_handler.go b/api/handler/admin/chat_handler.go index f9e3cfa0..a12e14c6 100644 --- a/api/handler/admin/chat_handler.go +++ b/api/handler/admin/chat_handler.go @@ -45,15 +45,15 @@ func (h *ChatHandler) RegisterRoutes() { } type chatItemVo struct { - Username string `json:"username"` - UserId uint `json:"user_id"` - ChatId string `json:"chat_id"` - Title string `json:"title"` - Role vo.ChatRole `json:"role"` - Model string `json:"model"` - Token int `json:"token"` - CreatedAt int64 `json:"created_at"` - MsgNum int `json:"msg_num"` // 消息数量 + Username string `json:"username"` + UserId uint `json:"user_id"` + ChatId string `json:"chat_id"` + Title string `json:"title"` + Role vo.ChatApp `json:"role"` + Model string `json:"model"` + Token int `json:"token"` + CreatedAt int64 `json:"created_at"` + MsgNum int `json:"msg_num"` // 消息数量 } func (h *ChatHandler) List(c *gin.Context) { @@ -103,7 +103,7 @@ func (h *ChatHandler) List(c *gin.Context) { } var messages []model.ChatMessage var users []model.User - var roles []model.ChatRole + var roles []model.ChatApp h.DB.Where("chat_id IN ?", chatIds).Find(&messages) h.DB.Where("id IN ?", userIds).Find(&users) h.DB.Where("id IN ?", roleIds).Find(&roles) @@ -111,7 +111,7 @@ func (h *ChatHandler) List(c *gin.Context) { tokenMap := make(map[string]int) userMap := make(map[uint]string) msgMap := make(map[string]int) - roleMap := make(map[uint]vo.ChatRole) + roleMap := make(map[uint]vo.ChatApp) for _, msg := range messages { tokenMap[msg.ChatId] += msg.Tokens msgMap[msg.ChatId] += 1 @@ -120,7 +120,7 @@ func (h *ChatHandler) List(c *gin.Context) { userMap[user.Id] = user.Username } for _, r := range roles { - var roleVo vo.ChatRole + var roleVo vo.ChatApp err := utils.CopyObject(r, &roleVo) if err != nil { continue diff --git a/api/handler/chat_role_handler.go b/api/handler/chat_app_handler.go similarity index 79% rename from api/handler/chat_role_handler.go rename to api/handler/chat_app_handler.go index 743834a4..ba2c0772 100644 --- a/api/handler/chat_role_handler.go +++ b/api/handler/chat_app_handler.go @@ -20,31 +20,31 @@ import ( "gorm.io/gorm" ) -type ChatRoleHandler struct { +type ChatAppHandler struct { BaseHandler } -func NewChatRoleHandler(app *core.AppServer, db *gorm.DB) *ChatRoleHandler { - return &ChatRoleHandler{BaseHandler: BaseHandler{App: app, DB: db}} +func NewChatAppHandler(app *core.AppServer, db *gorm.DB) *ChatAppHandler { + return &ChatAppHandler{BaseHandler: BaseHandler{App: app, DB: db}} } // RegisterRoutes 注册路由 -func (h *ChatRoleHandler) RegisterRoutes() { +func (h *ChatAppHandler) RegisterRoutes() { group := h.App.Engine.Group("/api/app/") + group.GET("list", h.List) // 需要用户授权的接口 group.Use(middleware.UserAuthMiddleware(h.App.Config.Session.SecretKey, h.App.Redis)) { - group.GET("list", h.List) group.GET("list/user", h.ListByUser) - group.POST("update", h.UpdateRole) + group.POST("update", h.UpdateApp) } } // List 获取用户聊天应用列表 -func (h *ChatRoleHandler) List(c *gin.Context) { +func (h *ChatAppHandler) List(c *gin.Context) { tid := h.GetInt(c, "tid", 0) - var roles []model.ChatRole + var roles []model.ChatApp session := h.DB.Where("enable", true) if tid > 0 { session = session.Where("tid", tid) @@ -55,9 +55,9 @@ func (h *ChatRoleHandler) List(c *gin.Context) { return } - var roleVos = make([]vo.ChatRole, 0) + var roleVos = make([]vo.ChatApp, 0) for _, r := range roles { - var v vo.ChatRole + var v vo.ChatApp err := utils.CopyObject(r, &v) if err == nil { v.Id = r.Id @@ -68,10 +68,10 @@ func (h *ChatRoleHandler) List(c *gin.Context) { } // ListByUser 获取用户添加的角色列表 -func (h *ChatRoleHandler) ListByUser(c *gin.Context) { +func (h *ChatAppHandler) ListByUser(c *gin.Context) { id := h.GetInt(c, "id", 0) userId := h.GetLoginUserId(c) - var roles []model.ChatRole + var roles []model.ChatApp session := h.DB.Where("enable", true) // 如果用户没登录,则获取所有角色 if userId > 0 { @@ -100,9 +100,9 @@ func (h *ChatRoleHandler) ListByUser(c *gin.Context) { return } - var roleVos = make([]vo.ChatRole, 0) + var roleVos = make([]vo.ChatApp, 0) for _, r := range roles { - var v vo.ChatRole + var v vo.ChatApp err := utils.CopyObject(r, &v) if err == nil { v.Id = r.Id @@ -112,8 +112,8 @@ func (h *ChatRoleHandler) ListByUser(c *gin.Context) { resp.SUCCESS(c, roleVos) } -// UpdateRole 更新用户聊天角色 -func (h *ChatRoleHandler) UpdateRole(c *gin.Context) { +// UpdateApp 更新用户聊天应用 +func (h *ChatAppHandler) UpdateApp(c *gin.Context) { user, err := h.GetLoginUser(c) if err != nil { resp.NotAuth(c) diff --git a/api/handler/chat_app_type_handler.go b/api/handler/chat_app_type_handler.go index dbbdd3c4..4a08ccf6 100644 --- a/api/handler/chat_app_type_handler.go +++ b/api/handler/chat_app_type_handler.go @@ -2,7 +2,6 @@ package handler import ( "geekai/core" - "geekai/core/middleware" "geekai/store/model" "geekai/store/vo" "geekai/utils" @@ -23,12 +22,7 @@ func NewChatAppTypeHandler(app *core.AppServer, db *gorm.DB) *ChatAppTypeHandler // RegisterRoutes 注册路由 func (h *ChatAppTypeHandler) RegisterRoutes() { group := h.App.Engine.Group("/api/app/type/") - - // 需要用户授权的接口 - group.Use(middleware.UserAuthMiddleware(h.App.Config.Session.SecretKey, h.App.Redis)) - { - group.GET("list", h.List) - } + group.GET("list", h.List) } // List 获取App类型列表 diff --git a/api/handler/chat_handler.go b/api/handler/chat_handler.go index 77195d15..bb223e67 100644 --- a/api/handler/chat_handler.go +++ b/api/handler/chat_handler.go @@ -55,7 +55,7 @@ type ChatInput struct { Stream bool `json:"stream"` Files []vo.File `json:"files"` ChatModel model.ChatModel `json:"chat_model,omitempty"` - ChatRole model.ChatRole `json:"chat_role,omitempty"` + ChatRole model.ChatApp `json:"chat_role,omitempty"` LastMsgId uint `json:"last_msg_id,omitempty"` // 最后的消息ID,用于重新生成答案的时候过滤上下文 } @@ -136,7 +136,7 @@ func (h *ChatHandler) Chat(c *gin.Context) { } // 验证聊天角色 - var chatRole model.ChatRole + var chatRole model.ChatApp err := h.DB.First(&chatRole, input.RoleId).Error if err != nil || !chatRole.Enable { pushMessage(c, ChatEventError, "当前聊天角色不存在或者未启用,请更换角色之后再发起对话!") diff --git a/api/handler/chat_item_handler.go b/api/handler/chat_item_handler.go index fbf777cc..de3ef75a 100644 --- a/api/handler/chat_item_handler.go +++ b/api/handler/chat_item_handler.go @@ -42,9 +42,9 @@ func (h *ChatHandler) List(c *gin.Context) { modelValues = append(modelValues, chat.Model) } - var roles []model.ChatRole + var roles []model.ChatApp var models []model.ChatModel - roleMap := make(map[uint]model.ChatRole) + roleMap := make(map[uint]model.ChatApp) modelMap := make(map[string]model.ChatModel) h.DB.Where("id IN ?", roleIds).Find(&roles) h.DB.Where("value IN ?", modelValues).Find(&models) @@ -205,7 +205,7 @@ func (h *ChatHandler) Detail(c *gin.Context) { } // 填充角色名称 - var role model.ChatRole + var role model.ChatApp res = h.DB.Where("id", chatItem.RoleId).First(&role) if res.Error != nil { resp.ERROR(c, "Role not found") diff --git a/api/main.go b/api/main.go index 8d3e9cd3..6f213700 100644 --- a/api/main.go +++ b/api/main.go @@ -127,7 +127,7 @@ func main() { }), // 创建控制器 - fx.Provide(handler.NewChatRoleHandler), + fx.Provide(handler.NewChatAppHandler), fx.Provide(handler.NewUserHandler), fx.Provide(handler.NewChatHandler), fx.Provide(handler.NewNetHandler), @@ -242,7 +242,7 @@ func main() { fx.Provide(service.NewUserService), // 注册路由 - fx.Invoke(func(s *core.AppServer, h *handler.ChatRoleHandler) { + fx.Invoke(func(s *core.AppServer, h *handler.ChatAppHandler) { h.RegisterRoutes() }), fx.Invoke(func(s *core.AppServer, h *handler.UserHandler) { diff --git a/api/service/license_service.go b/api/service/license_service.go index 96b1b6a0..e979bfce 100644 --- a/api/service/license_service.go +++ b/api/service/license_service.go @@ -110,6 +110,11 @@ func (s *LicenseService) SyncLicense() { s.license.IsActive = false } else { s.license = license + // 保存 License 到数据库 + err = s.db.Model(&model.Config{}).Where("name = ?", types.ConfigKeyLicense).UpdateColumn("value", utils.JsonEncode(s.license)).Error + if err != nil { + logger.Errorf("保存 License 到数据库失败: %v", err) + } } urls, err := s.fetchUrlWhiteList() @@ -184,6 +189,11 @@ func (s *LicenseService) GetLicense() *types.License { return s.license } +func (s *LicenseService) SetLicense(licenseKey string) { + s.license.Key = licenseKey + +} + // IsValidApiURL 判断是否合法的中转 URL func (s *LicenseService) IsValidApiURL(uri string) error { // 获得许可授权的直接放行 diff --git a/api/service/migration_service.go b/api/service/migration_service.go index 223963bf..8e96e642 100644 --- a/api/service/migration_service.go +++ b/api/service/migration_service.go @@ -28,18 +28,20 @@ const ( // MigrationService 配置迁移服务 type MigrationService struct { - db *gorm.DB - redisClient *redis.Client - appConfig *types.AppConfig - levelDB *store.LevelDB + db *gorm.DB + redisClient *redis.Client + appConfig *types.AppConfig + levelDB *store.LevelDB + licenseService *LicenseService } -func NewMigrationService(db *gorm.DB, redisClient *redis.Client, appConfig *types.AppConfig, levelDB *store.LevelDB) *MigrationService { +func NewMigrationService(db *gorm.DB, redisClient *redis.Client, appConfig *types.AppConfig, levelDB *store.LevelDB, licenseService *LicenseService) *MigrationService { return &MigrationService{ - db: db, - redisClient: redisClient, - appConfig: appConfig, - levelDB: levelDB, + db: db, + redisClient: redisClient, + appConfig: appConfig, + levelDB: levelDB, + licenseService: licenseService, } } @@ -71,6 +73,7 @@ func (s *MigrationService) MigrateLicense() { logger.Errorf("迁移 License 失败: %v", err) return } + s.licenseService.SetLicense(license.Key) logger.Info("迁移 License 完成") s.redisClient.Set(context.Background(), key, "1", 0) } diff --git a/api/store/model/chat_role.go b/api/store/model/chat_app.go similarity index 95% rename from api/store/model/chat_role.go rename to api/store/model/chat_app.go index 7ff16646..ac912a01 100644 --- a/api/store/model/chat_role.go +++ b/api/store/model/chat_app.go @@ -4,7 +4,7 @@ import ( "time" ) -type ChatRole struct { +type ChatApp struct { Id uint `gorm:"column:id;primaryKey;autoIncrement" json:"id"` Name string `gorm:"column:name;type:varchar(30);not null;comment:角色名称" json:"name"` Tid uint `gorm:"column:tid;type:int(11);not null;comment:分类ID" json:"tid"` @@ -19,6 +19,6 @@ type ChatRole struct { UpdatedAt time.Time `gorm:"column:updated_at;type:datetime;not null" json:"updated_at"` } -func (m *ChatRole) TableName() string { +func (m *ChatApp) TableName() string { return "chatgpt_chat_roles" } diff --git a/api/store/vo/chat_role.go b/api/store/vo/chat_app.go similarity index 96% rename from api/store/vo/chat_role.go rename to api/store/vo/chat_app.go index a7d46756..12311bcb 100644 --- a/api/store/vo/chat_role.go +++ b/api/store/vo/chat_app.go @@ -2,7 +2,7 @@ package vo import "geekai/core/types" -type ChatRole struct { +type ChatApp struct { BaseVo Key string `json:"key"` // 角色唯一标识 Tid uint `json:"tid"` diff --git a/web/src/components/ItemList.vue b/web/src/components/ItemList.vue index e87bf2fe..4d670321 100644 --- a/web/src/components/ItemList.vue +++ b/web/src/components/ItemList.vue @@ -46,7 +46,6 @@ const calcSpan = () => { span.value = 1 return } - console.log(cols) while (cols > 1) { if (24 % cols === 0) { span.value = 24 / cols diff --git a/web/src/components/LoginDialog.vue b/web/src/components/LoginDialog.vue index 418eface..9c585d0f 100644 --- a/web/src/components/LoginDialog.vue +++ b/web/src/components/LoginDialog.vue @@ -90,13 +90,19 @@
+
+ +

二维码已过期

-
-
+

快捷操作

@@ -59,7 +51,7 @@
-