From 75545a1f47147f0f9520307bbdfb069e21986360 Mon Sep 17 00:00:00 2001 From: JustSong Date: Mon, 19 Jun 2023 09:53:56 +0800 Subject: [PATCH] refactor: make operation settings separated from system settings --- web/src/components/OperationSetting.js | 282 +++++++++++++++++++++++++ web/src/components/SystemSetting.js | 192 +---------------- web/src/pages/Setting/index.js | 9 + 3 files changed, 292 insertions(+), 191 deletions(-) create mode 100644 web/src/components/OperationSetting.js diff --git a/web/src/components/OperationSetting.js b/web/src/components/OperationSetting.js new file mode 100644 index 00000000..3f3a4ab0 --- /dev/null +++ b/web/src/components/OperationSetting.js @@ -0,0 +1,282 @@ +import React, { useEffect, useState } from 'react'; +import { Divider, Form, Grid, Header } from 'semantic-ui-react'; +import { API, showError, verifyJSON } from '../helpers'; + +const OperationSetting = () => { + let [inputs, setInputs] = useState({ + QuotaForNewUser: 0, + QuotaForInviter: 0, + QuotaForInvitee: 0, + QuotaRemindThreshold: 0, + PreConsumedQuota: 0, + ModelRatio: '', + GroupRatio: '', + TopUpLink: '', + ChatLink: '', + AutomaticDisableChannelEnabled: '', + ChannelDisableThreshold: 0, + LogConsumeEnabled: '' + }); + const [originInputs, setOriginInputs] = useState({}); + let [loading, setLoading] = useState(false); + + const getOptions = async () => { + const res = await API.get('/api/option/'); + const { success, message, data } = res.data; + if (success) { + let newInputs = {}; + data.forEach((item) => { + if (item.key === 'ModelRatio' || item.key === 'GroupRatio') { + item.value = JSON.stringify(JSON.parse(item.value), null, 2); + } + newInputs[item.key] = item.value; + }); + setInputs(newInputs); + setOriginInputs(newInputs); + } else { + showError(message); + } + }; + + useEffect(() => { + getOptions().then(); + }, []); + + const updateOption = async (key, value) => { + setLoading(true); + if (key.endsWith('Enabled')) { + value = inputs[key] === 'true' ? 'false' : 'true'; + } + const res = await API.put('/api/option/', { + key, + value + }); + const { success, message } = res.data; + if (success) { + setInputs((inputs) => ({ ...inputs, [key]: value })); + } else { + showError(message); + } + setLoading(false); + }; + + const handleInputChange = async (e, { name, value }) => { + if (name.endsWith('Enabled')) { + await updateOption(name, value); + } else { + setInputs((inputs) => ({ ...inputs, [name]: value })); + } + }; + + const submitConfig = async (group) => { + switch (group) { + case 'monitor': + if (originInputs['AutomaticDisableChannelEnabled'] !== inputs.AutomaticDisableChannelEnabled) { + await updateOption('AutomaticDisableChannelEnabled', inputs.AutomaticDisableChannelEnabled); + } + if (originInputs['ChannelDisableThreshold'] !== inputs.ChannelDisableThreshold) { + await updateOption('ChannelDisableThreshold', inputs.ChannelDisableThreshold); + } + if (originInputs['QuotaRemindThreshold'] !== inputs.QuotaRemindThreshold) { + await updateOption('QuotaRemindThreshold', inputs.QuotaRemindThreshold); + } + break; + case 'ratio': + if (originInputs['ModelRatio'] !== inputs.ModelRatio) { + if (!verifyJSON(inputs.ModelRatio)) { + showError('模型倍率不是合法的 JSON 字符串'); + return; + } + await updateOption('ModelRatio', inputs.ModelRatio); + } + if (originInputs['GroupRatio'] !== inputs.GroupRatio) { + if (!verifyJSON(inputs.GroupRatio)) { + showError('分组倍率不是合法的 JSON 字符串'); + return; + } + await updateOption('GroupRatio', inputs.GroupRatio); + } + break; + case 'quota': + if (originInputs['QuotaForNewUser'] !== inputs.QuotaForNewUser) { + await updateOption('QuotaForNewUser', inputs.QuotaForNewUser); + } + if (originInputs['QuotaForInvitee'] !== inputs.QuotaForInvitee) { + await updateOption('QuotaForInvitee', inputs.QuotaForInvitee); + } + if (originInputs['QuotaForInviter'] !== inputs.QuotaForInviter) { + await updateOption('QuotaForInviter', inputs.QuotaForInviter); + } + if (originInputs['PreConsumedQuota'] !== inputs.PreConsumedQuota) { + await updateOption('PreConsumedQuota', inputs.PreConsumedQuota); + } + break; + case 'general': + if (originInputs['TopUpLink'] !== inputs.TopUpLink) { + await updateOption('TopUpLink', inputs.TopUpLink); + } + if (originInputs['ChatLink'] !== inputs.ChatLink) { + await updateOption('ChatLink', inputs.ChatLink); + } + break; + } + }; + + return ( + + +
+
+ 通用设置 +
+ + + + + { + submitConfig('general').then(); + }}>保存通用设置 + +
+ 监控设置 +
+ + + + + + + + { + submitConfig('monitor').then(); + }}>保存监控设置 + +
+ 额度设置 +
+ + + + + + + { + submitConfig('quota').then(); + }}>保存额度设置 + +
+ 倍率设置 +
+ + + + + + + + { + submitConfig('ratio').then(); + }}>保存倍率设置 + +
+
+ ); +}; + +export default OperationSetting; diff --git a/web/src/components/SystemSetting.js b/web/src/components/SystemSetting.js index 786e935b..658e5294 100644 --- a/web/src/components/SystemSetting.js +++ b/web/src/components/SystemSetting.js @@ -26,18 +26,6 @@ const SystemSetting = () => { TurnstileSiteKey: '', TurnstileSecretKey: '', RegisterEnabled: '', - QuotaForNewUser: 0, - QuotaForInviter: 0, - QuotaForInvitee: 0, - QuotaRemindThreshold: 0, - PreConsumedQuota: 0, - ModelRatio: '', - GroupRatio: '', - TopUpLink: '', - ChatLink: '', - AutomaticDisableChannelEnabled: '', - ChannelDisableThreshold: 0, - LogConsumeEnabled: '' }); const [originInputs, setOriginInputs] = useState({}); let [loading, setLoading] = useState(false); @@ -71,8 +59,6 @@ const SystemSetting = () => { case 'WeChatAuthEnabled': case 'TurnstileCheckEnabled': case 'RegisterEnabled': - case 'AutomaticDisableChannelEnabled': - case 'LogConsumeEnabled': value = inputs[key] === 'true' ? 'false' : 'true'; break; default: @@ -102,16 +88,7 @@ const SystemSetting = () => { name === 'WeChatServerToken' || name === 'WeChatAccountQRCodeImageURL' || name === 'TurnstileSiteKey' || - name === 'TurnstileSecretKey' || - name === 'QuotaForNewUser' || - name === 'QuotaForInviter' || - name === 'QuotaForInvitee' || - name === 'QuotaRemindThreshold' || - name === 'PreConsumedQuota' || - name === 'ModelRatio' || - name === 'GroupRatio' || - name === 'TopUpLink' || - name === 'ChatLink' + name === 'TurnstileSecretKey' ) { setInputs((inputs) => ({ ...inputs, [name]: value })); } else { @@ -124,44 +101,6 @@ const SystemSetting = () => { await updateOption('ServerAddress', ServerAddress); }; - const submitOperationConfig = async () => { - if (originInputs['QuotaForNewUser'] !== inputs.QuotaForNewUser) { - await updateOption('QuotaForNewUser', inputs.QuotaForNewUser); - } - if (originInputs['QuotaForInvitee'] !== inputs.QuotaForInvitee) { - await updateOption('QuotaForInvitee', inputs.QuotaForInvitee); - } - if (originInputs['QuotaForInviter'] !== inputs.QuotaForInviter) { - await updateOption('QuotaForInviter', inputs.QuotaForInviter); - } - if (originInputs['QuotaRemindThreshold'] !== inputs.QuotaRemindThreshold) { - await updateOption('QuotaRemindThreshold', inputs.QuotaRemindThreshold); - } - if (originInputs['PreConsumedQuota'] !== inputs.PreConsumedQuota) { - await updateOption('PreConsumedQuota', inputs.PreConsumedQuota); - } - if (originInputs['ModelRatio'] !== inputs.ModelRatio) { - if (!verifyJSON(inputs.ModelRatio)) { - showError('模型倍率不是合法的 JSON 字符串'); - return; - } - await updateOption('ModelRatio', inputs.ModelRatio); - } - if (originInputs['GroupRatio'] !== inputs.GroupRatio) { - if (!verifyJSON(inputs.GroupRatio)) { - showError('分组倍率不是合法的 JSON 字符串'); - return; - } - await updateOption('GroupRatio', inputs.GroupRatio); - } - if (originInputs['TopUpLink'] !== inputs.TopUpLink) { - await updateOption('TopUpLink', inputs.TopUpLink); - } - if (originInputs['ChatLink'] !== inputs.ChatLink) { - await updateOption('ChatLink', inputs.ChatLink); - } - }; - const submitSMTP = async () => { if (originInputs['SMTPServer'] !== inputs.SMTPServer) { await updateOption('SMTPServer', inputs.SMTPServer); @@ -300,135 +239,6 @@ const SystemSetting = () => { /> -
- 运营设置 -
- - - - - - - - - - - - - - - - - - - 保存运营设置 - -
- 监控设置 -
- - - - - - -
配置 SMTP 用以支持系统的邮件发送 diff --git a/web/src/pages/Setting/index.js b/web/src/pages/Setting/index.js index 392e2ca7..30d0ef28 100644 --- a/web/src/pages/Setting/index.js +++ b/web/src/pages/Setting/index.js @@ -4,6 +4,7 @@ import SystemSetting from '../../components/SystemSetting'; import { isRoot } from '../../helpers'; import OtherSetting from '../../components/OtherSetting'; import PersonalSetting from '../../components/PersonalSetting'; +import OperationSetting from '../../components/OperationSetting'; const Setting = () => { let panes = [ @@ -18,6 +19,14 @@ const Setting = () => { ]; if (isRoot()) { + panes.push({ + menuItem: '运营设置', + render: () => ( + + + + ) + }); panes.push({ menuItem: '系统设置', render: () => (