From 8ced447a14298afb96d727dfa8fc1ac6cb4087c6 Mon Sep 17 00:00:00 2001 From: RockYang Date: Fri, 7 Feb 2025 18:02:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=AD=BE=E5=88=B0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 4 + api/core/types/chat.go | 3 + api/handler/user_handler.go | 36 +++- api/main.go | 1 + web/src/App.vue | 2 +- web/src/assets/css/suno.styl | 3 + web/src/components/ChatReply.vue | 6 +- web/src/components/UserProfile.vue | 22 +- web/src/utils/libs.js | 336 +++++++++++++++-------------- web/src/views/admin/ApiKey.vue | 1 + web/src/views/admin/ChatModel.vue | 2 +- 11 files changed, 246 insertions(+), 170 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c2406cb..ea3a7ec2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ - 功能优化:优化聊天页面 Notice 组件样式,采用 Vuepress 文档样式 - Bug 修复:修复主题切换的组件显示异常问题 +- 功能优化:支持 DeepSeek-R1 推理模型,优化推理样式输出 +- 功能优化:优化 Suno 歌曲播放按钮样式,居中显示 +- 功能优化:后台管理新增模型的时候,可以绑定所有的 API KEY,而不只是能绑定 Chat 类型的 API KEY +- 功能新增:新增每日签到功能,每日签到可以获得算力奖励 ## v4.1.9 diff --git a/api/core/types/chat.go b/api/core/types/chat.go index 4be882db..17e734c1 100644 --- a/api/core/types/chat.go +++ b/api/core/types/chat.go @@ -95,6 +95,7 @@ const ( PowerInvite = PowerType(4) // 邀请奖励 PowerRedeem = PowerType(5) // 众筹 PowerGift = PowerType(6) // 系统赠送 + PowerSignIn = PowerType(7) // 每日签到 ) func (t PowerType) String() string { @@ -111,6 +112,8 @@ func (t PowerType) String() string { return "赠送" case PowerInvite: return "邀请" + case PowerSignIn: + return "签到" } return "其他" } diff --git a/api/handler/user_handler.go b/api/handler/user_handler.go index 8066e3fd..070345d0 100644 --- a/api/handler/user_handler.go +++ b/api/handler/user_handler.go @@ -12,14 +12,16 @@ import ( "geekai/core" "geekai/core/types" "geekai/service" + "geekai/store" "geekai/store/model" "geekai/store/vo" "geekai/utils" "geekai/utils/resp" - "github.com/imroc/req/v3" "strings" "time" + "github.com/imroc/req/v3" + "github.com/go-redis/redis/v8" "github.com/golang-jwt/jwt/v5" @@ -32,6 +34,7 @@ type UserHandler struct { BaseHandler searcher *xdb.Searcher redis *redis.Client + levelDB *store.LevelDB licenseService *service.LicenseService captcha *service.CaptchaService userService *service.UserService @@ -42,6 +45,7 @@ func NewUserHandler( db *gorm.DB, searcher *xdb.Searcher, client *redis.Client, + levelDB *store.LevelDB, captcha *service.CaptchaService, userService *service.UserService, licenseService *service.LicenseService) *UserHandler { @@ -49,6 +53,7 @@ func NewUserHandler( BaseHandler: BaseHandler{DB: db, App: app}, searcher: searcher, redis: client, + levelDB: levelDB, captcha: captcha, licenseService: licenseService, userService: userService, @@ -184,7 +189,7 @@ func (h *UserHandler) Register(c *gin.Context) { if h.App.SysConfig.InvitePower > 0 { err := h.userService.IncreasePower(int(inviteCode.UserId), h.App.SysConfig.InvitePower, model.PowerLog{ Type: types.PowerInvite, - Model: "Invite", + Model: "Invite", Remark: fmt.Sprintf("邀请用户注册奖励,金额:%d,邀请码:%s,新用户:%s", h.App.SysConfig.InvitePower, inviteCode.Code, user.Username), }) if err != nil { @@ -712,3 +717,30 @@ func (h *UserHandler) BindEmail(c *gin.Context) { _ = h.redis.Del(c, key) // 删除短信验证码 resp.SUCCESS(c) } + +// SignIn 每日签到 +func (h *UserHandler) SignIn(c *gin.Context) { + // 获取当前日期 + date := time.Now().Format("2006-01-02") + + // 检查是否已经签到 + userId := h.GetLoginUserId(c) + key := fmt.Sprintf("signin/%d/%s", userId, date) + var signIn bool + err := h.levelDB.Get(key, &signIn) + if err == nil && signIn { + resp.ERROR(c, "今日已签到,请明日再来!") + return + } + + // 签到 + h.levelDB.Put(key, true) + if h.App.SysConfig.DailyPower > 0 { + h.userService.IncreasePower(int(userId), h.App.SysConfig.DailyPower, model.PowerLog{ + Type: types.PowerSignIn, + Model: "SignIn", + Remark: fmt.Sprintf("每日签到奖励,金额:%d", h.App.SysConfig.DailyPower), + }) + } + resp.SUCCESS(c) +} diff --git a/api/main.go b/api/main.go index 69087b04..234fba2a 100644 --- a/api/main.go +++ b/api/main.go @@ -244,6 +244,7 @@ func main() { group.POST("resetPass", h.ResetPass) group.GET("clogin", h.CLogin) group.GET("clogin/callback", h.CLoginCallback) + group.GET("signin", h.SignIn) }), fx.Invoke(func(s *core.AppServer, h *handler.ChatHandler) { group := s.Engine.Group("/api/chat/") diff --git a/web/src/App.vue b/web/src/App.vue index a0893a4a..c0d638c1 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -114,7 +114,7 @@ console.log( "color: red;font-size: 20px;font-family: '微软雅黑';" ); -console.log("%c 一曲肝肠断,天涯何处觅知音?愿你出走半生,归来仍是少年!", "color: #7c39ed;font-size: 18px;font-family: '微软雅黑';"); +console.log("%c 愿你出走半生,归来仍是少年!大奉武夫许七安,前来凿阵!", "color: #7c39ed;font-size: 18px;font-family: '微软雅黑';");