From 6d9ae196d697184f8c7442fddbc231669cbed1bf Mon Sep 17 00:00:00 2001 From: wood Date: Wed, 8 Nov 2023 00:19:46 +0800 Subject: [PATCH] 1 --- README.md | 4 +- common/model-ratio.go | 1 + controller/model.go | 9 + router/api-router.go | 334 +++++++++++++++------ web/public/index.html | 2 +- web/src/App.js | 9 - web/src/components/PasswordResetConfirm.js | 2 +- web/src/components/PasswordResetForm.js | 2 +- web/src/components/PersonalSetting.js | 170 +++++------ web/src/helpers/utils.js | 2 +- 10 files changed, 336 insertions(+), 199 deletions(-) diff --git a/README.md b/README.md index 0bbce359..bb46baa6 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ - [x] 用户管理界面,支持快速设置用户组,在`web\src\components\UsersTable.js`处修改相关值; - [x] 令牌界面,删除无用的多种复制、聊天等按钮; - [x] 删除系统访问令牌; -- [ ] 在个人设置页面显示分组; +- [x] 在个人设置页面显示分组,使用信息等; - [ ] 渠道管理处,已启用渠道和禁用渠道,启用/禁用按钮改为不同颜色; - [x] 等 @@ -18,7 +18,7 @@

- one-api logo + one-api logo

diff --git a/common/model-ratio.go b/common/model-ratio.go index 6935c480..d913322c 100644 --- a/common/model-ratio.go +++ b/common/model-ratio.go @@ -45,6 +45,7 @@ var ModelRatio = map[string]float64{ "text-moderation-stable": 0.1, "text-moderation-latest": 0.1, "dall-e": 8, + "dall-e-3": 20, "claude-instant-1": 0.815, // $1.63 / 1M tokens "claude-2": 5.51, // $11.02 / 1M tokens "ERNIE-Bot": 0.8572, // ¥0.012 / 1k tokens diff --git a/controller/model.go b/controller/model.go index f15cf68b..46262b9a 100644 --- a/controller/model.go +++ b/controller/model.go @@ -63,6 +63,15 @@ func init() { Root: "dall-e", Parent: nil, }, + { + Id: "dall-e-3", + Object: "model", + Created: 1677649963, + OwnedBy: "openai", + Permission: permission, + Root: "dall-e-3", + Parent: nil, + }, { Id: "whisper-1", Object: "model", diff --git a/router/api-router.go b/router/api-router.go index da3f9e61..fd6ac8fc 100644 --- a/router/api-router.go +++ b/router/api-router.go @@ -8,107 +8,241 @@ import ( "github.com/gin-gonic/gin" ) +// func SetApiRouter(router *gin.Engine) { +// apiRouter := router.Group("/api") +// apiRouter.Use(gzip.Gzip(gzip.DefaultCompression)) +// apiRouter.Use(middleware.GlobalAPIRateLimit()) +// { +// apiRouter.GET("/status", controller.GetStatus) +// apiRouter.GET("/notice", controller.GetNotice) +// apiRouter.GET("/about", controller.GetAbout) +// apiRouter.GET("/home_page_content", controller.GetHomePageContent) +// apiRouter.GET("/verification", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.SendEmailVerification) +// apiRouter.GET("/reset_password", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.SendPasswordResetEmail) +// apiRouter.POST("/user/reset", middleware.CriticalRateLimit(), controller.ResetPassword) +// apiRouter.GET("/oauth/github", middleware.CriticalRateLimit(), controller.GitHubOAuth) +// apiRouter.GET("/oauth/state", middleware.CriticalRateLimit(), controller.GenerateOAuthCode) +// apiRouter.GET("/oauth/wechat", middleware.CriticalRateLimit(), controller.WeChatAuth) +// apiRouter.GET("/oauth/wechat/bind", middleware.CriticalRateLimit(), middleware.UserAuth(), controller.WeChatBind) +// apiRouter.GET("/oauth/email/bind", middleware.CriticalRateLimit(), middleware.UserAuth(), controller.EmailBind) + +// userRoute := apiRouter.Group("/user") +// { +// userRoute.POST("/register", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.Register) +// userRoute.POST("/login", middleware.CriticalRateLimit(), controller.Login) +// userRoute.GET("/logout", controller.Logout) + +// selfRoute := userRoute.Group("/") +// selfRoute.Use(middleware.UserAuth()) +// { +// selfRoute.GET("/self", controller.GetSelf) +// selfRoute.PUT("/self", controller.UpdateSelf) +// selfRoute.DELETE("/self", controller.DeleteSelf) +// selfRoute.GET("/token", controller.GenerateAccessToken) +// selfRoute.GET("/aff", controller.GetAffCode) +// selfRoute.POST("/topup", controller.TopUp) +// } + +// adminRoute := userRoute.Group("/") +// adminRoute.Use(middleware.AdminAuth()) +// { +// adminRoute.GET("/", controller.GetAllUsers) +// adminRoute.GET("/search", controller.SearchUsers) +// adminRoute.GET("/:id", controller.GetUser) +// adminRoute.POST("/", controller.CreateUser) +// adminRoute.POST("/manage", controller.ManageUser) +// adminRoute.PUT("/", controller.UpdateUser) +// adminRoute.DELETE("/:id", controller.DeleteUser) +// } +// } +// optionRoute := apiRouter.Group("/option") +// optionRoute.Use(middleware.RootAuth()) +// { +// optionRoute.GET("/", controller.GetOptions) +// optionRoute.PUT("/", controller.UpdateOption) +// } +// channelRoute := apiRouter.Group("/channel") +// channelRoute.Use(middleware.AdminAuth()) +// { +// channelRoute.GET("/", controller.GetAllChannels) +// channelRoute.GET("/search", controller.SearchChannels) +// channelRoute.GET("/models", controller.ListModels) +// channelRoute.GET("/:id", controller.GetChannel) +// channelRoute.GET("/test", controller.TestAllChannels) +// channelRoute.GET("/test/:id", controller.TestChannel) +// channelRoute.GET("/update_balance", controller.UpdateAllChannelsBalance) +// channelRoute.GET("/update_balance/:id", controller.UpdateChannelBalance) +// channelRoute.POST("/", controller.AddChannel) +// channelRoute.PUT("/", controller.UpdateChannel) +// channelRoute.DELETE("/disabled", controller.DeleteDisabledChannel) +// channelRoute.DELETE("/:id", controller.DeleteChannel) +// } +// tokenRoute := apiRouter.Group("/token") +// tokenRoute.Use(middleware.UserAuth()) +// { +// tokenRoute.GET("/", controller.GetAllTokens) +// tokenRoute.GET("/search", controller.SearchTokens) +// tokenRoute.GET("/:id", controller.GetToken) +// tokenRoute.POST("/", controller.AddToken) +// tokenRoute.PUT("/", controller.UpdateToken) +// tokenRoute.DELETE("/:id", controller.DeleteToken) +// } +// redemptionRoute := apiRouter.Group("/redemption") +// redemptionRoute.Use(middleware.AdminAuth()) +// { +// redemptionRoute.GET("/", controller.GetAllRedemptions) +// redemptionRoute.GET("/search", controller.SearchRedemptions) +// redemptionRoute.GET("/:id", controller.GetRedemption) +// redemptionRoute.POST("/", controller.AddRedemption) +// redemptionRoute.PUT("/", controller.UpdateRedemption) +// redemptionRoute.DELETE("/:id", controller.DeleteRedemption) +// } +// logRoute := apiRouter.Group("/log") +// logRoute.GET("/", middleware.AdminAuth(), controller.GetAllLogs) +// logRoute.DELETE("/", middleware.AdminAuth(), controller.DeleteHistoryLogs) +// logRoute.GET("/stat", middleware.AdminAuth(), controller.GetLogsStat) +// logRoute.GET("/self/stat", middleware.UserAuth(), controller.GetLogsSelfStat) +// logRoute.GET("/search", middleware.AdminAuth(), controller.SearchAllLogs) +// logRoute.GET("/self", middleware.UserAuth(), controller.GetUserLogs) +// logRoute.GET("/self/search", middleware.UserAuth(), controller.SearchUserLogs) +// groupRoute := apiRouter.Group("/group") +// groupRoute.Use(middleware.AdminAuth()) +// { +// groupRoute.GET("/", controller.GetGroups) +// } +// } +// } + +// 设置API路由 func SetApiRouter(router *gin.Engine) { - apiRouter := router.Group("/api") - apiRouter.Use(gzip.Gzip(gzip.DefaultCompression)) - apiRouter.Use(middleware.GlobalAPIRateLimit()) - { - apiRouter.GET("/status", controller.GetStatus) - apiRouter.GET("/notice", controller.GetNotice) - apiRouter.GET("/about", controller.GetAbout) - apiRouter.GET("/home_page_content", controller.GetHomePageContent) - apiRouter.GET("/verification", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.SendEmailVerification) - apiRouter.GET("/reset_password", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.SendPasswordResetEmail) - apiRouter.POST("/user/reset", middleware.CriticalRateLimit(), controller.ResetPassword) - apiRouter.GET("/oauth/github", middleware.CriticalRateLimit(), controller.GitHubOAuth) - apiRouter.GET("/oauth/state", middleware.CriticalRateLimit(), controller.GenerateOAuthCode) - apiRouter.GET("/oauth/wechat", middleware.CriticalRateLimit(), controller.WeChatAuth) - apiRouter.GET("/oauth/wechat/bind", middleware.CriticalRateLimit(), middleware.UserAuth(), controller.WeChatBind) - apiRouter.GET("/oauth/email/bind", middleware.CriticalRateLimit(), middleware.UserAuth(), controller.EmailBind) + // 创建API路由分组 + apiRouter := router.Group("/api") + // 使用gzip压缩中间件 + apiRouter.Use(gzip.Gzip(gzip.DefaultCompression)) + // 使用全局API速率限制中间件 + apiRouter.Use(middleware.GlobalAPIRateLimit()) + { + // 设置GET请求的路由处理函数 + apiRouter.GET("/status", controller.GetStatus) + apiRouter.GET("/notice", controller.GetNotice) + apiRouter.GET("/about", controller.GetAbout) + apiRouter.GET("/home_page_content", controller.GetHomePageContent) + apiRouter.GET("/verification", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.SendEmailVerification) + apiRouter.GET("/reset_password", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.SendPasswordResetEmail) + apiRouter.POST("/user/reset", middleware.CriticalRateLimit(), controller.ResetPassword) + apiRouter.GET("/oauth/github", middleware.CriticalRateLimit(), controller.GitHubOAuth) + apiRouter.GET("/oauth/state", middleware.CriticalRateLimit(), controller.GenerateOAuthCode) + apiRouter.GET("/oauth/wechat", middleware.CriticalRateLimit(), controller.WeChatAuth) + apiRouter.GET("/oauth/wechat/bind", middleware.CriticalRateLimit(), middleware.UserAuth(), controller.WeChatBind) + apiRouter.GET("/oauth/email/bind", middleware.CriticalRateLimit(), middleware.UserAuth(), controller.EmailBind) + // 添加新的路由 + - userRoute := apiRouter.Group("/user") - { - userRoute.POST("/register", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.Register) - userRoute.POST("/login", middleware.CriticalRateLimit(), controller.Login) - userRoute.GET("/logout", controller.Logout) + // 创建user路由分组 + userRoute := apiRouter.Group("/user") + { + // 设置POST请求的路由处理函数 + userRoute.POST("/register", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.Register) + userRoute.POST("/login", middleware.CriticalRateLimit(), controller.Login) + userRoute.GET("/logout", controller.Logout) - selfRoute := userRoute.Group("/") - selfRoute.Use(middleware.UserAuth()) - { - selfRoute.GET("/self", controller.GetSelf) - selfRoute.PUT("/self", controller.UpdateSelf) - selfRoute.DELETE("/self", controller.DeleteSelf) - selfRoute.GET("/token", controller.GenerateAccessToken) - selfRoute.GET("/aff", controller.GetAffCode) - selfRoute.POST("/topup", controller.TopUp) - } + // 创建self路由分组,并使用用户认证中间件 + selfRoute := userRoute.Group("/") + selfRoute.Use(middleware.UserAuth()) + { + // 设置GET请求的路由处理函数 + selfRoute.GET("/self", controller.GetSelf) + selfRoute.PUT("/self", controller.UpdateSelf) + selfRoute.DELETE("/self", controller.DeleteSelf) + selfRoute.GET("/token", controller.GenerateAccessToken) + selfRoute.GET("/aff", controller.GetAffCode) + selfRoute.POST("/topup", controller.TopUp) + } - adminRoute := userRoute.Group("/") - adminRoute.Use(middleware.AdminAuth()) - { - adminRoute.GET("/", controller.GetAllUsers) - adminRoute.GET("/search", controller.SearchUsers) - adminRoute.GET("/:id", controller.GetUser) - adminRoute.POST("/", controller.CreateUser) - adminRoute.POST("/manage", controller.ManageUser) - adminRoute.PUT("/", controller.UpdateUser) - adminRoute.DELETE("/:id", controller.DeleteUser) - } - } - optionRoute := apiRouter.Group("/option") - optionRoute.Use(middleware.RootAuth()) - { - optionRoute.GET("/", controller.GetOptions) - optionRoute.PUT("/", controller.UpdateOption) - } - channelRoute := apiRouter.Group("/channel") - channelRoute.Use(middleware.AdminAuth()) - { - channelRoute.GET("/", controller.GetAllChannels) - channelRoute.GET("/search", controller.SearchChannels) - channelRoute.GET("/models", controller.ListModels) - channelRoute.GET("/:id", controller.GetChannel) - channelRoute.GET("/test", controller.TestAllChannels) - channelRoute.GET("/test/:id", controller.TestChannel) - channelRoute.GET("/update_balance", controller.UpdateAllChannelsBalance) - channelRoute.GET("/update_balance/:id", controller.UpdateChannelBalance) - channelRoute.POST("/", controller.AddChannel) - channelRoute.PUT("/", controller.UpdateChannel) - channelRoute.DELETE("/disabled", controller.DeleteDisabledChannel) - channelRoute.DELETE("/:id", controller.DeleteChannel) - } - tokenRoute := apiRouter.Group("/token") - tokenRoute.Use(middleware.UserAuth()) - { - tokenRoute.GET("/", controller.GetAllTokens) - tokenRoute.GET("/search", controller.SearchTokens) - tokenRoute.GET("/:id", controller.GetToken) - tokenRoute.POST("/", controller.AddToken) - tokenRoute.PUT("/", controller.UpdateToken) - tokenRoute.DELETE("/:id", controller.DeleteToken) - } - redemptionRoute := apiRouter.Group("/redemption") - redemptionRoute.Use(middleware.AdminAuth()) - { - redemptionRoute.GET("/", controller.GetAllRedemptions) - redemptionRoute.GET("/search", controller.SearchRedemptions) - redemptionRoute.GET("/:id", controller.GetRedemption) - redemptionRoute.POST("/", controller.AddRedemption) - redemptionRoute.PUT("/", controller.UpdateRedemption) - redemptionRoute.DELETE("/:id", controller.DeleteRedemption) - } - logRoute := apiRouter.Group("/log") - logRoute.GET("/", middleware.AdminAuth(), controller.GetAllLogs) - logRoute.DELETE("/", middleware.AdminAuth(), controller.DeleteHistoryLogs) - logRoute.GET("/stat", middleware.AdminAuth(), controller.GetLogsStat) - logRoute.GET("/self/stat", middleware.UserAuth(), controller.GetLogsSelfStat) - logRoute.GET("/search", middleware.AdminAuth(), controller.SearchAllLogs) - logRoute.GET("/self", middleware.UserAuth(), controller.GetUserLogs) - logRoute.GET("/self/search", middleware.UserAuth(), controller.SearchUserLogs) - groupRoute := apiRouter.Group("/group") - groupRoute.Use(middleware.AdminAuth()) - { - groupRoute.GET("/", controller.GetGroups) - } - } -} + // 创建admin路由分组,并使用管理员认证中间件 + adminRoute := userRoute.Group("/") + adminRoute.Use(middleware.AdminAuth()) + { + // 设置GET请求的路由处理函数 + adminRoute.GET("/", controller.GetAllUsers) + adminRoute.GET("/search", controller.SearchUsers) + adminRoute.GET("/:id", controller.GetUser) + adminRoute.POST("/", controller.CreateUser) + adminRoute.POST("/manage", controller.ManageUser) + adminRoute.PUT("/", controller.UpdateUser) + adminRoute.DELETE("/:id", controller.DeleteUser) + } + } + + // 创建option路由分组,并使用根认证中间件 + optionRoute := apiRouter.Group("/option") + optionRoute.Use(middleware.RootAuth()) + { + // 设置GET请求的路由处理函数 + optionRoute.GET("/", controller.GetOptions) + optionRoute.PUT("/", controller.UpdateOption) + } + + // 创建channel路由分组,并使用管理员认证中间件 + channelRoute := apiRouter.Group("/channel") + channelRoute.Use(middleware.AdminAuth()) + { + // 设置GET请求的路由处理函数 + channelRoute.GET("/", controller.GetAllChannels) + channelRoute.GET("/search", controller.SearchChannels) + channelRoute.GET("/:id", controller.GetChannel) + channelRoute.GET("/test", controller.TestAllChannels) + channelRoute.GET("/test/:id", controller.TestChannel) + channelRoute.GET("/update_balance", controller.UpdateAllChannelsBalance) + channelRoute.GET("/update_balance/:id", controller.UpdateChannelBalance) + channelRoute.POST("/", controller.AddChannel) + channelRoute.PUT("/", controller.UpdateChannel) + channelRoute.DELETE("/disabled", controller.DeleteDisabledChannel) + channelRoute.DELETE("/:id", controller.DeleteChannel) + } + + // 创建token路由分组,并使用用户认证中间件 + tokenRoute := apiRouter.Group("/token") + tokenRoute.Use(middleware.UserAuth()) + { + // 设置GET请求的路由处理函数 + tokenRoute.GET("/", controller.GetAllTokens) + tokenRoute.GET("/search", controller.SearchTokens) + tokenRoute.GET("/:id", controller.GetToken) + tokenRoute.POST("/", controller.AddToken) + tokenRoute.PUT("/", controller.UpdateToken) + tokenRoute.DELETE("/:id", controller.DeleteToken) + } + + // 创建redemption路由分组,并使用管理员认证中间件 + redemptionRoute := apiRouter.Group("/redemption") + redemptionRoute.Use(middleware.AdminAuth()) + { + // 设置GET请求的路由处理函数 + redemptionRoute.GET("/", controller.GetAllRedemptions) + redemptionRoute.GET("/search", controller.SearchRedemptions) + redemptionRoute.GET("/:id", controller.GetRedemption) + redemptionRoute.POST("/", controller.AddRedemption) + redemptionRoute.PUT("/", controller.UpdateRedemption) + redemptionRoute.DELETE("/:id", controller.DeleteRedemption) + } + + // 创建log路由分组 + logRoute := apiRouter.Group("/") + logRoute.GET("/", middleware.AdminAuth(), controller.GetAllLogs) + logRoute.DELETE("/", middleware.AdminAuth(), controller.DeleteHistoryLogs) + logRoute.GET("/stat", middleware.AdminAuth(), controller.GetLogsStat) + logRoute.GET("/self/stat", middleware.UserAuth(), controller.GetLogsSelfStat) + logRoute.GET("/search", middleware.AdminAuth(), controller.SearchAllLogs) + logRoute.GET("/self", middleware.UserAuth(), controller.GetUserLogs) + logRoute.GET("/self/search", middleware.UserAuth(), controller.SearchUserLogs) + + // 创建group路由分组,并使用管理员认证中间件 + groupRoute := apiRouter.Group("/group") + groupRoute.Use(middleware.AdminAuth()) + { + // 设置GET请求的路由处理函数 + groupRoute.GET("/", controller.GetGroups) + } + } +} \ No newline at end of file diff --git a/web/public/index.html b/web/public/index.html index 6cde9f84..060d69fa 100644 --- a/web/public/index.html +++ b/web/public/index.html @@ -3,7 +3,7 @@ - + {
- 密码重置确认 + 密码重置确认
diff --git a/web/src/components/PasswordResetForm.js b/web/src/components/PasswordResetForm.js index e8309417..0da5228a 100644 --- a/web/src/components/PasswordResetForm.js +++ b/web/src/components/PasswordResetForm.js @@ -59,7 +59,7 @@ const PasswordResetForm = () => {
- 密码重置 + 密码重置
diff --git a/web/src/components/PersonalSetting.js b/web/src/components/PersonalSetting.js index 8c4efbb9..b3fc1be6 100644 --- a/web/src/components/PersonalSetting.js +++ b/web/src/components/PersonalSetting.js @@ -1,5 +1,5 @@ import React, { useContext, useEffect, useState } from 'react'; -import { Button, Divider, Form, Header, Image, Message, Modal } from 'semantic-ui-react'; +import { Button, Divider, Form, Header, Image, Message, Modal, Label } from 'semantic-ui-react'; import { Link, useNavigate } from 'react-router-dom'; import { API, copy, showError, showInfo, showNotice, showSuccess } from '../helpers'; import Turnstile from 'react-turnstile'; @@ -19,7 +19,6 @@ const PersonalSetting = () => { const [status, setStatus] = useState({}); const [showWeChatBindModal, setShowWeChatBindModal] = useState(false); const [showEmailBindModal, setShowEmailBindModal] = useState(false); - const [showAccountDeleteModal, setShowAccountDeleteModal] = useState(false); const [turnstileEnabled, setTurnstileEnabled] = useState(false); const [turnstileSiteKey, setTurnstileSiteKey] = useState(''); const [turnstileToken, setTurnstileToken] = useState(''); @@ -28,6 +27,13 @@ const PersonalSetting = () => { const [countdown, setCountdown] = useState(30); const [affLink, setAffLink] = useState(""); const [systemToken, setSystemToken] = useState(""); + const [userGroup, setUserGroup] = useState(null); + const [quota, setQuota] = useState(null); + const [usedQuota, setUsedQuota] = useState(null); + const [requestCount, setRequestCount] = useState(null); + const [githubID, setGithubID] = useState(null); + + useEffect(() => { let status = localStorage.getItem('status'); @@ -41,6 +47,50 @@ const PersonalSetting = () => { } }, []); + // Get user group + useEffect(() => { + (async () => { + const res = await API.get(`/api/user/self`); + if (res.data.success) { + setUserGroup(res.data.data.group); + setQuota(res.data.data.quota); + setUsedQuota(res.data.data.used_quota); + setRequestCount(res.data.data.request_count); + setGithubID(res.data.data.github_id); + } else { + // Handle the error here + } + })(); + }, []); + const quotaPerUnit = parseInt(localStorage.getItem("quota_per_unit")); + + + const transformUserGroup = (group) => { + switch (group) { + case 'default': + return '默认用户'; + case 'vip': + return 'VIP用户'; + case 'svip': + return 'SVIP用户'; + default: + return group; + } + }; + const getUserGroupColor = (group) => { + switch (group) { + case 'default': + return 'var(--czl-grayA)'; + case 'vip': + return 'var(--czl-success-color)'; + case 'svip': + return 'var(--czl-error-color)'; + default: + return ''; + } + }; + + useEffect(() => { let countdownInterval = null; if (disableButton && countdown > 0) { @@ -58,19 +108,6 @@ const PersonalSetting = () => { setInputs((inputs) => ({ ...inputs, [name]: value })); }; - const generateAccessToken = async () => { - const res = await API.get('/api/user/token'); - const { success, message, data } = res.data; - if (success) { - setSystemToken(data); - setAffLink(""); - await copy(data); - showSuccess(`令牌已重置并已复制到剪贴板`); - } else { - showError(message); - } - }; - const getAffLink = async () => { const res = await API.get('/api/user/aff'); const { success, message, data } = res.data; @@ -169,6 +206,26 @@ const PersonalSetting = () => { return (
+
使用信息
+ {userGroup && ( + + )} + {quota !== null && quotaPerUnit && ( + + )} + {usedQuota !== null && quotaPerUnit && ( + + )} + {requestCount !== null && } + +
通用设置
{/* 注意,此处生成的令牌用于系统管理,而非用于请求 OpenAI 相关的服务,请知悉。 @@ -178,24 +235,21 @@ const PersonalSetting = () => { {/* */} - - + {systemToken && ( - )} {affLink && ( - @@ -244,7 +298,7 @@ const PersonalSetting = () => { { status.github_oauth && ( - + ) } -
- -
- - - - - setShowAccountDeleteModal(false)} - onOpen={() => setShowAccountDeleteModal(true)} - open={showAccountDeleteModal} - size={'tiny'} - style={{ maxWidth: '450px' }} - > - 危险操作 - - 您正在删除自己的帐户,将清空所有数据且不可恢复 - -
- - {turnstileEnabled ? ( - { - setTurnstileToken(token); - }} - /> - ) : ( - <> - )}
diff --git a/web/src/helpers/utils.js b/web/src/helpers/utils.js index 235087b9..18fdae46 100644 --- a/web/src/helpers/utils.js +++ b/web/src/helpers/utils.js @@ -28,7 +28,7 @@ export function getSystemName() { export function getLogo() { let logo = localStorage.getItem('logo'); - if (!logo) return 'https://cdn-img-r2.czl.net/2023/06/20/649168ebc2b5d.png'; + if (!logo) return '/logo.png'; return logo }