From d84c2f5c7017fbcfb3d49dfc32d9740d12acf5b1 Mon Sep 17 00:00:00 2001 From: JustSong Date: Sat, 13 May 2023 21:27:49 +0800 Subject: [PATCH] feat: able to customize home page now (#24) --- README.md | 2 +- controller/misc.go | 11 +++ model/option.go | 1 + router/api-router.go | 1 + web/src/components/OtherSetting.js | 16 ++++ web/src/pages/Home/index.js | 142 +++++++++++++++++------------ 6 files changed, 112 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index 6776dff3..1d7eb2d0 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ _✨ All in one 的 OpenAI 接口,整合各种 API 访问方式,开箱即用 5. 支持设置令牌的过期时间和使用次数。 6. 支持批量生成和导出兑换码,可使用兑换码为令牌进行充值。 7. 支持为新用户设置初始配额。 -8. 支持发布公告,在线修改关于页面,设置充值链接,自定义页脚。 +8. 支持自定义首页,发布公告,自定义关于页面,设置充值链接,自定义页脚。 9. 支持通过系统访问令牌访问管理 API。 10. 多种用户登录注册方式: + 邮箱登录注册以及通过邮箱进行密码重置。 diff --git a/controller/misc.go b/controller/misc.go index 837c1df4..a9424d05 100644 --- a/controller/misc.go +++ b/controller/misc.go @@ -54,6 +54,17 @@ func GetAbout(c *gin.Context) { return } +func GetHomePageContent(c *gin.Context) { + common.OptionMapRWMutex.RLock() + defer common.OptionMapRWMutex.RUnlock() + c.JSON(http.StatusOK, gin.H{ + "success": true, + "message": "", + "data": common.OptionMap["HomePageContent"], + }) + return +} + func SendEmailVerification(c *gin.Context) { email := c.Query("email") if err := common.Validate.Var(email, "required,email"); err != nil { diff --git a/model/option.go b/model/option.go index 391fad0a..87ab9196 100644 --- a/model/option.go +++ b/model/option.go @@ -39,6 +39,7 @@ func InitOptionMap() { common.OptionMap["SMTPToken"] = "" common.OptionMap["Notice"] = "" common.OptionMap["About"] = "" + common.OptionMap["HomePageContent"] = "" common.OptionMap["Footer"] = common.Footer common.OptionMap["ServerAddress"] = "" common.OptionMap["GitHubClientId"] = "" diff --git a/router/api-router.go b/router/api-router.go index ded70500..09646b9e 100644 --- a/router/api-router.go +++ b/router/api-router.go @@ -15,6 +15,7 @@ func SetApiRouter(router *gin.Engine) { 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) diff --git a/web/src/components/OtherSetting.js b/web/src/components/OtherSetting.js index 5c125169..4b1272b1 100644 --- a/web/src/components/OtherSetting.js +++ b/web/src/components/OtherSetting.js @@ -8,6 +8,7 @@ const OtherSetting = () => { Footer: '', Notice: '', About: '', + HomePageContent: '', }); let originInputs = {}; let [loading, setLoading] = useState(false); @@ -69,6 +70,10 @@ const OtherSetting = () => { await updateOption('About', inputs.About); }; + const submitOption = async (key) => { + await updateOption(key, inputs[key]); + }; + const openGitHubRelease = () => { window.location = 'https://github.com/songquanpeng/one-api/releases/latest'; @@ -109,6 +114,17 @@ const OtherSetting = () => { 保存公告
个性化设置
+ + + + submitOption('HomePageContent')}>保存首页内容 { const [statusState, statusDispatch] = useContext(StatusContext); + const [homePageContent, setHomePageContent] = useState(''); const displayNotice = async () => { const res = await API.get('/api/notice'); @@ -20,6 +22,19 @@ const Home = () => { } }; + const displayHomePageContent = async () => { + const res = await API.get('/api/home_page_content'); + const { success, message, data } = res.data; + if (success) { + let HTMLContent = marked.parse(data); + localStorage.setItem('home_page_content', HTMLContent); + setHomePageContent(HTMLContent); + } else { + showError(message); + setHomePageContent('加载首页内容失败...'); + } + }; + const getStartTimeString = () => { const timestamp = statusState?.status?.start_time; return timestamp2string(timestamp); @@ -27,69 +42,76 @@ const Home = () => { useEffect(() => { displayNotice().then(); + displayHomePageContent().then(); }, []); return ( <> -
系统状况
- - - - - 系统信息 - 系统信息总览 - -

名称:{statusState?.status?.system_name}

-

版本:{statusState?.status?.version}

-

- 源码: - - https://github.com/songquanpeng/one-api - -

-

启动时间:{getStartTimeString()}

-
-
-
-
- - - - 系统配置 - 系统配置总览 - -

- 邮箱验证: - {statusState?.status?.email_verification === true - ? '已启用' - : '未启用'} -

-

- GitHub 身份验证: - {statusState?.status?.github_oauth === true - ? '已启用' - : '未启用'} -

-

- 微信身份验证: - {statusState?.status?.wechat_login === true - ? '已启用' - : '未启用'} -

-

- Turnstile 用户校验: - {statusState?.status?.turnstile_check === true - ? '已启用' - : '未启用'} -

-
-
-
-
-
+ { + homePageContent === '' ? <> +
系统状况
+ + + + + 系统信息 + 系统信息总览 + +

名称:{statusState?.status?.system_name}

+

版本:{statusState?.status?.version}

+

+ 源码: + + https://github.com/songquanpeng/one-api + +

+

启动时间:{getStartTimeString()}

+
+
+
+
+ + + + 系统配置 + 系统配置总览 + +

+ 邮箱验证: + {statusState?.status?.email_verification === true + ? '已启用' + : '未启用'} +

+

+ GitHub 身份验证: + {statusState?.status?.github_oauth === true + ? '已启用' + : '未启用'} +

+

+ 微信身份验证: + {statusState?.status?.wechat_login === true + ? '已启用' + : '未启用'} +

+

+ Turnstile 用户校验: + {statusState?.status?.turnstile_check === true + ? '已启用' + : '未启用'} +

+
+
+
+
+
+ : <> +
+ + }
);