From 290523b6753140eb4ea016282938e412b1e2e747 Mon Sep 17 00:00:00 2001 From: Martial BE Date: Sat, 13 Jan 2024 02:46:32 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix:=20exception=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/contexts/StatusContext.js | 61 ++++--- web/src/utils/api.js | 2 +- web/src/utils/common.js | 16 +- web/src/views/About/index.js | 25 +-- .../AuthForms/ForgetPasswordForm.js | 26 ++- .../AuthForms/ResetPasswordForm.js | 22 ++- web/src/views/Channel/component/EditModal.js | 86 +++++---- web/src/views/Channel/component/TableRow.js | 18 +- web/src/views/Channel/index.js | 165 ++++++++++-------- web/src/views/Dashboard/index.js | 44 +++-- web/src/views/Home/index.js | 52 +++--- web/src/views/Log/index.js | 26 +-- web/src/views/Profile/component/EmailModal.js | 31 ++-- web/src/views/Profile/index.js | 39 +++-- .../views/Redemption/component/EditModal.js | 66 ++++--- web/src/views/Redemption/index.js | 91 ++++++---- .../Setting/component/OperationSetting.js | 70 +++++--- .../views/Setting/component/OtherSetting.js | 78 +++++---- .../views/Setting/component/SystemSetting.js | 70 ++++---- web/src/views/Token/component/EditModal.js | 53 +++--- web/src/views/Token/index.js | 89 ++++++---- web/src/views/Topup/component/InviteCard.js | 23 ++- web/src/views/Topup/component/TopupCard.js | 16 +- web/src/views/User/component/EditModal.js | 53 +++--- web/src/views/User/index.js | 70 +++++--- 25 files changed, 754 insertions(+), 538 deletions(-) diff --git a/web/src/contexts/StatusContext.js b/web/src/contexts/StatusContext.js index d39f54e6..c4929a1d 100644 --- a/web/src/contexts/StatusContext.js +++ b/web/src/contexts/StatusContext.js @@ -11,40 +11,43 @@ const StatusProvider = ({ children }) => { const dispatch = useDispatch(); const loadStatus = useCallback(async () => { - const res = await API.get('/api/status'); - const { success, data } = res.data; let system_name = ''; - if (success) { - if (!data.chat_link) { - delete data.chat_link; - } - localStorage.setItem('siteInfo', JSON.stringify(data)); - localStorage.setItem('quota_per_unit', data.quota_per_unit); - localStorage.setItem('display_in_currency', data.display_in_currency); - dispatch({ type: SET_SITE_INFO, payload: data }); - if ( - data.version !== process.env.REACT_APP_VERSION && - data.version !== 'v0.0.0' && - data.version !== '' && - process.env.REACT_APP_VERSION !== '' - ) { - showNotice(`新版本可用:${data.version},请使用快捷键 Shift + F5 刷新页面`); - } - if (data.system_name) { - system_name = data.system_name; - } - } else { - const backupSiteInfo = localStorage.getItem('siteInfo'); - if (backupSiteInfo) { - const data = JSON.parse(backupSiteInfo); + try { + const res = await API.get('/api/status'); + const { success, data } = res.data; + if (success) { + if (!data.chat_link) { + delete data.chat_link; + } + localStorage.setItem('siteInfo', JSON.stringify(data)); + localStorage.setItem('quota_per_unit', data.quota_per_unit); + localStorage.setItem('display_in_currency', data.display_in_currency); + dispatch({ type: SET_SITE_INFO, payload: data }); + if ( + data.version !== process.env.REACT_APP_VERSION && + data.version !== 'v0.0.0' && + data.version !== '' && + process.env.REACT_APP_VERSION !== '' + ) { + showNotice(`新版本可用:${data.version},请使用快捷键 Shift + F5 刷新页面`); + } if (data.system_name) { system_name = data.system_name; } - dispatch({ - type: SET_SITE_INFO, - payload: data - }); + } else { + const backupSiteInfo = localStorage.getItem('siteInfo'); + if (backupSiteInfo) { + const data = JSON.parse(backupSiteInfo); + if (data.system_name) { + system_name = data.system_name; + } + dispatch({ + type: SET_SITE_INFO, + payload: data + }); + } } + } catch (error) { showError('无法正常连接至服务器!'); } diff --git a/web/src/utils/api.js b/web/src/utils/api.js index d8088635..b60014b3 100644 --- a/web/src/utils/api.js +++ b/web/src/utils/api.js @@ -13,7 +13,7 @@ API.interceptors.response.use( if (error.response?.status === 401) { localStorage.removeItem('user'); store.dispatch({ type: LOGIN, payload: null }); - window.location.href = '/login'; + // window.location.href = '/login'; } if (error.response?.data?.message) { diff --git a/web/src/utils/common.js b/web/src/utils/common.js index 25e5c635..32128164 100644 --- a/web/src/utils/common.js +++ b/web/src/utils/common.js @@ -70,12 +70,16 @@ export function showInfo(message) { } export async function getOAuthState() { - const res = await API.get('/api/oauth/state'); - const { success, message, data } = res.data; - if (success) { - return data; - } else { - showError(message); + try { + const res = await API.get('/api/oauth/state'); + const { success, message, data } = res.data; + if (success) { + return data; + } else { + showError(message); + return ''; + } + } catch (error) { return ''; } } diff --git a/web/src/views/About/index.js b/web/src/views/About/index.js index afc30d73..7ed1f18a 100644 --- a/web/src/views/About/index.js +++ b/web/src/views/About/index.js @@ -11,19 +11,24 @@ const About = () => { const displayAbout = async () => { setAbout(localStorage.getItem('about') || ''); - const res = await API.get('/api/about'); - const { success, message, data } = res.data; - if (success) { - let aboutContent = data; - if (!data.startsWith('https://')) { - aboutContent = marked.parse(data); + try { + const res = await API.get('/api/about'); + const { success, message, data } = res.data; + if (success) { + let aboutContent = data; + if (!data.startsWith('https://')) { + aboutContent = marked.parse(data); + } + setAbout(aboutContent); + localStorage.setItem('about', aboutContent); + } else { + showError(message); + setAbout('加载关于内容失败...'); } - setAbout(aboutContent); - localStorage.setItem('about', aboutContent); - } else { - showError(message); + } catch (error) { setAbout('加载关于内容失败...'); } + setAboutLoaded(true); }; diff --git a/web/src/views/Authentication/AuthForms/ForgetPasswordForm.js b/web/src/views/Authentication/AuthForms/ForgetPasswordForm.js index 06107a07..83621375 100644 --- a/web/src/views/Authentication/AuthForms/ForgetPasswordForm.js +++ b/web/src/views/Authentication/AuthForms/ForgetPasswordForm.js @@ -30,6 +30,12 @@ const ForgetPasswordForm = ({ ...others }) => { const [disableButton, setDisableButton] = useState(false); const [countdown, setCountdown] = useState(30); + const handleFailure = (message) => { + showError(message); + setDisableButton(false); + setCountdown(30); + }; + const submit = async (values, { setSubmitting }) => { setDisableButton(true); setSubmitting(true); @@ -38,15 +44,17 @@ const ForgetPasswordForm = ({ ...others }) => { setSubmitting(false); return; } - const res = await API.get(`/api/reset_password?email=${values.email}&turnstile=${turnstileToken}`); - const { success, message } = res.data; - if (success) { - showSuccess('重置邮件发送成功,请检查邮箱!'); - setSendEmail(true); - } else { - showError(message); - setDisableButton(false); - setCountdown(30); + try { + const res = await API.get(`/api/reset_password?email=${values.email}&turnstile=${turnstileToken}`); + const { success, message } = res.data; + if (success) { + showSuccess('重置邮件发送成功,请检查邮箱!'); + setSendEmail(true); + } else { + handleFailure(message); + } + } catch (error) { + handleFailure('服务器错误'); } setSubmitting(false); }; diff --git a/web/src/views/Authentication/AuthForms/ResetPasswordForm.js b/web/src/views/Authentication/AuthForms/ResetPasswordForm.js index 226c0e5c..c55618d9 100644 --- a/web/src/views/Authentication/AuthForms/ResetPasswordForm.js +++ b/web/src/views/Authentication/AuthForms/ResetPasswordForm.js @@ -19,15 +19,19 @@ const ResetPasswordForm = () => { const [newPassword, setNewPassword] = useState(''); const submit = async () => { - const res = await API.post(`/api/user/reset`, inputs); - const { success, message } = res.data; - if (success) { - let password = res.data.data; - setNewPassword(password); - navigator.clipboard.writeText(password); - showInfo(`新密码已复制到剪贴板:${password}`); - } else { - showError(message); + try { + const res = await API.post(`/api/user/reset`, inputs); + const { success, message } = res.data; + if (success) { + let password = res.data.data; + setNewPassword(password); + navigator.clipboard.writeText(password); + showInfo(`新密码已复制到剪贴板:${password}`); + } else { + showError(message); + } + } catch (error) { + return; } }; diff --git a/web/src/views/Channel/component/EditModal.js b/web/src/views/Channel/component/EditModal.js index 1c088ba2..379746df 100644 --- a/web/src/views/Channel/component/EditModal.js +++ b/web/src/views/Channel/component/EditModal.js @@ -171,25 +171,33 @@ const EditModal = ({ open, channelId, onCancel, onOk }) => { let res; const modelsStr = values.models.map((model) => model.id).join(','); values.group = values.groups.join(','); - if (channelId) { - res = await API.put(`/api/channel/`, { ...values, id: parseInt(channelId), models: modelsStr }); - } else { - res = await API.post(`/api/channel/`, { ...values, models: modelsStr }); - } - const { success, message } = res.data; - if (success) { + try { if (channelId) { - showSuccess('渠道更新成功!'); + res = await API.put(`/api/channel/`, { ...values, id: parseInt(channelId), models: modelsStr }); } else { - showSuccess('渠道创建成功!'); + res = await API.post(`/api/channel/`, { ...values, models: modelsStr }); } - setSubmitting(false); - setStatus({ success: true }); - onOk(true); - } else { + const { success, message } = res.data; + if (success) { + if (channelId) { + showSuccess('渠道更新成功!'); + } else { + showSuccess('渠道创建成功!'); + } + setSubmitting(false); + setStatus({ success: true }); + onOk(true); + return; + } else { + setStatus({ success: false }); + showError(message); + setErrors({ submit: message }); + } + } catch (error) { setStatus({ success: false }); - showError(message); - setErrors({ submit: message }); + showError(error.message); + setErrors({ submit: error.message }); + return; } }; @@ -213,29 +221,33 @@ const EditModal = ({ open, channelId, onCancel, onOk }) => { } const loadChannel = async () => { - let res = await API.get(`/api/channel/${channelId}`); - const { success, message, data } = res.data; - if (success) { - if (data.models === '') { - data.models = []; - } else { - data.models = initialModel(data.models); - } - if (data.group === '') { - data.groups = []; - } else { - data.groups = data.group.split(','); - } - if (data.model_mapping !== '') { - data.model_mapping = JSON.stringify(JSON.parse(data.model_mapping), null, 2); - } + try { + let res = await API.get(`/api/channel/${channelId}`); + const { success, message, data } = res.data; + if (success) { + if (data.models === '') { + data.models = []; + } else { + data.models = initialModel(data.models); + } + if (data.group === '') { + data.groups = []; + } else { + data.groups = data.group.split(','); + } + if (data.model_mapping !== '') { + data.model_mapping = JSON.stringify(JSON.parse(data.model_mapping), null, 2); + } - data.base_url = data.base_url ?? ''; - data.is_edit = true; - initChannel(data.type); - setInitialInput(data); - } else { - showError(message); + data.base_url = data.base_url ?? ''; + data.is_edit = true; + initChannel(data.type); + setInitialInput(data); + } else { + showError(message); + } + } catch (error) { + return; } }; diff --git a/web/src/views/Channel/component/TableRow.js b/web/src/views/Channel/component/TableRow.js index 6bea8076..72b62c0f 100644 --- a/web/src/views/Channel/component/TableRow.js +++ b/web/src/views/Channel/component/TableRow.js @@ -82,14 +82,18 @@ export default function ChannelTableRow({ item, manageChannel, handleOpenModal, }; const updateChannelBalance = async () => { - const res = await API.get(`/api/channel/update_balance/${item.id}`); - const { success, message, balance } = res.data; - if (success) { - setItemBalance(balance); + try { + const res = await API.get(`/api/channel/update_balance/${item.id}`); + const { success, message, balance } = res.data; + if (success) { + setItemBalance(balance); - showInfo(`余额更新成功!`); - } else { - showError(message); + showInfo(`余额更新成功!`); + } else { + showError(message); + } + } catch (error) { + return; } }; diff --git a/web/src/views/Channel/index.js b/web/src/views/Channel/index.js index 1d6d0bc9..c397f2c9 100644 --- a/web/src/views/Channel/index.js +++ b/web/src/views/Channel/index.js @@ -36,19 +36,24 @@ export default function ChannelPage() { const loadChannels = async (startIdx) => { setSearching(true); - const res = await API.get(`/api/channel/?p=${startIdx}`); - const { success, message, data } = res.data; - if (success) { - if (startIdx === 0) { - setChannels(data); + try { + const res = await API.get(`/api/channel/?p=${startIdx}`); + const { success, message, data } = res.data; + if (success) { + if (startIdx === 0) { + setChannels(data); + } else { + let newChannels = [...channels]; + newChannels.splice(startIdx * ITEMS_PER_PAGE, data.length, ...data); + setChannels(newChannels); + } } else { - let newChannels = [...channels]; - newChannels.splice(startIdx * ITEMS_PER_PAGE, data.length, ...data); - setChannels(newChannels); + showError(message); } - } else { - showError(message); + } catch (error) { + console.error(error); } + setSearching(false); }; @@ -70,13 +75,17 @@ export default function ChannelPage() { return; } setSearching(true); - const res = await API.get(`/api/channel/search?keyword=${searchKeyword}`); - const { success, message, data } = res.data; - if (success) { - setChannels(data); - setActivePage(0); - } else { - showError(message); + try { + const res = await API.get(`/api/channel/search?keyword=${searchKeyword}`); + const { success, message, data } = res.data; + if (success) { + setChannels(data); + setActivePage(0); + } else { + showError(message); + } + } catch (error) { + console.error(error); } setSearching(false); }; @@ -89,40 +98,45 @@ export default function ChannelPage() { const url = '/api/channel/'; let data = { id }; let res; - switch (action) { - case 'delete': - res = await API.delete(url + id); - break; - case 'status': - res = await API.put(url, { - ...data, - status: value - }); - break; - case 'priority': - if (value === '') { - return; - } - res = await API.put(url, { - ...data, - priority: parseInt(value) - }); - break; - case 'test': - res = await API.get(url + `test/${id}`); - break; - } - const { success, message } = res.data; - if (success) { - showSuccess('操作成功完成!'); - if (action === 'delete') { - await handleRefresh(); - } - } else { - showError(message); - } - return res.data; + try { + switch (action) { + case 'delete': + res = await API.delete(url + id); + break; + case 'status': + res = await API.put(url, { + ...data, + status: value + }); + break; + case 'priority': + if (value === '') { + return; + } + res = await API.put(url, { + ...data, + priority: parseInt(value) + }); + break; + case 'test': + res = await API.get(url + `test/${id}`); + break; + } + const { success, message } = res.data; + if (success) { + showSuccess('操作成功完成!'); + if (action === 'delete') { + await handleRefresh(); + } + } else { + showError(message); + } + + return res.data; + } catch (error) { + return; + } }; // 处理刷新 @@ -132,37 +146,50 @@ export default function ChannelPage() { // 处理测试所有启用渠道 const testAllChannels = async () => { - const res = await API.get(`/api/channel/test`); - const { success, message } = res.data; - if (success) { - showInfo('已成功开始测试所有通道,请刷新页面查看结果。'); - } else { - showError(message); + try { + const res = await API.get(`/api/channel/test`); + const { success, message } = res.data; + if (success) { + showInfo('已成功开始测试所有通道,请刷新页面查看结果。'); + } else { + showError(message); + } + } catch (error) { + return; } }; // 处理删除所有禁用渠道 const deleteAllDisabledChannels = async () => { - const res = await API.delete(`/api/channel/disabled`); - const { success, message, data } = res.data; - if (success) { - showSuccess(`已删除所有禁用渠道,共计 ${data} 个`); - await handleRefresh(); - } else { - showError(message); + try { + const res = await API.delete(`/api/channel/disabled`); + const { success, message, data } = res.data; + if (success) { + showSuccess(`已删除所有禁用渠道,共计 ${data} 个`); + await handleRefresh(); + } else { + showError(message); + } + } catch (error) { + return; } }; // 处理更新所有启用渠道余额 const updateAllChannelsBalance = async () => { setSearching(true); - const res = await API.get(`/api/channel/update_balance`); - const { success, message } = res.data; - if (success) { - showInfo('已更新完毕所有已启用通道余额!'); - } else { - showError(message); + try { + const res = await API.get(`/api/channel/update_balance`); + const { success, message } = res.data; + if (success) { + showInfo('已更新完毕所有已启用通道余额!'); + } else { + showError(message); + } + } catch (error) { + console.log(error); } + setSearching(false); }; diff --git a/web/src/views/Dashboard/index.js b/web/src/views/Dashboard/index.js index 5b7a4d38..61dbbc1b 100644 --- a/web/src/views/Dashboard/index.js +++ b/web/src/views/Dashboard/index.js @@ -18,29 +18,37 @@ const Dashboard = () => { const [users, setUsers] = useState([]); const userDashboard = async () => { - const res = await API.get('/api/user/dashboard'); - const { success, message, data } = res.data; - if (success) { - if (data) { - let lineData = getLineDataGroup(data); - setRequestChart(getLineCardOption(lineData, 'RequestCount')); - setQuotaChart(getLineCardOption(lineData, 'Quota')); - setTokenChart(getLineCardOption(lineData, 'PromptTokens')); - setStatisticalData(getBarDataGroup(data)); + try { + const res = await API.get('/api/user/dashboard'); + const { success, message, data } = res.data; + if (success) { + if (data) { + let lineData = getLineDataGroup(data); + setRequestChart(getLineCardOption(lineData, 'RequestCount')); + setQuotaChart(getLineCardOption(lineData, 'Quota')); + setTokenChart(getLineCardOption(lineData, 'PromptTokens')); + setStatisticalData(getBarDataGroup(data)); + } + } else { + showError(message); } - } else { - showError(message); + setLoading(false); + } catch (error) { + return; } - setLoading(false); }; const loadUser = async () => { - let res = await API.get(`/api/user/self`); - const { success, message, data } = res.data; - if (success) { - setUsers(data); - } else { - showError(message); + try { + let res = await API.get(`/api/user/self`); + const { success, message, data } = res.data; + if (success) { + setUsers(data); + } else { + showError(message); + } + } catch (error) { + return; } }; diff --git a/web/src/views/Home/index.js b/web/src/views/Home/index.js index df0160d4..e9a4ff93 100644 --- a/web/src/views/Home/index.js +++ b/web/src/views/Home/index.js @@ -9,36 +9,44 @@ const Home = () => { const [homePageContentLoaded, setHomePageContentLoaded] = useState(false); const [homePageContent, setHomePageContent] = useState(''); const displayNotice = async () => { - const res = await API.get('/api/notice'); - const { success, message, data } = res.data; - if (success) { - let oldNotice = localStorage.getItem('notice'); - if (data !== oldNotice && data !== '') { - const htmlNotice = marked(data); - showNotice(htmlNotice, true); - localStorage.setItem('notice', data); + try { + const res = await API.get('/api/notice'); + const { success, message, data } = res.data; + if (success) { + let oldNotice = localStorage.getItem('notice'); + if (data !== oldNotice && data !== '') { + const htmlNotice = marked(data); + showNotice(htmlNotice, true); + localStorage.setItem('notice', data); + } + } else { + showError(message); } - } else { - showError(message); + } catch (error) { + return; } }; const displayHomePageContent = async () => { setHomePageContent(localStorage.getItem('home_page_content') || ''); - const res = await API.get('/api/home_page_content'); - const { success, message, data } = res.data; - if (success) { - let content = data; - if (!data.startsWith('https://')) { - content = marked.parse(data); + try { + const res = await API.get('/api/home_page_content'); + const { success, message, data } = res.data; + if (success) { + let content = data; + if (!data.startsWith('https://')) { + content = marked.parse(data); + } + setHomePageContent(content); + localStorage.setItem('home_page_content', content); + } else { + showError(message); + setHomePageContent('加载首页内容失败...'); } - setHomePageContent(content); - localStorage.setItem('home_page_content', content); - } else { - showError(message); - setHomePageContent('加载首页内容失败...'); + setHomePageContentLoaded(true); + } catch (error) { + return; } - setHomePageContentLoaded(true); }; useEffect(() => { diff --git a/web/src/views/Log/index.js b/web/src/views/Log/index.js index 3acfa832..43567531 100644 --- a/web/src/views/Log/index.js +++ b/web/src/views/Log/index.js @@ -47,19 +47,25 @@ export default function Log() { delete query.username; delete query.channel; } - const res = await API.get(url, { params: query }); - const { success, message, data } = res.data; - if (success) { - if (startIdx === 0) { - setLogs(data); + + try { + const res = await API.get(url, { params: query }); + const { success, message, data } = res.data; + if (success) { + if (startIdx === 0) { + setLogs(data); + } else { + let newLogs = [...logs]; + newLogs.splice(startIdx * ITEMS_PER_PAGE, data.length, ...data); + setLogs(newLogs); + } } else { - let newLogs = [...logs]; - newLogs.splice(startIdx * ITEMS_PER_PAGE, data.length, ...data); - setLogs(newLogs); + showError(message); } - } else { - showError(message); + } catch (error) { + console.log(error); } + setSearching(false); }; diff --git a/web/src/views/Profile/component/EmailModal.js b/web/src/views/Profile/component/EmailModal.js index 1e6dcc86..094c7872 100644 --- a/web/src/views/Profile/component/EmailModal.js +++ b/web/src/views/Profile/component/EmailModal.js @@ -26,7 +26,7 @@ const validationSchema = Yup.object().shape({ email_verification_code: Yup.string().required('验证码不能为空') }); -const EmailModal = ({ open, handleClose, turnstileToken }) => { +const EmailModal = ({ open, handleClose, turnstileToken, turnstileEnabled }) => { const theme = useTheme(); const [countdown, setCountdown] = useState(30); const [disableButton, setDisableButton] = useState(false); @@ -36,16 +36,20 @@ const EmailModal = ({ open, handleClose, turnstileToken }) => { const submit = async (values, { setErrors, setStatus, setSubmitting }) => { setLoading(true); setSubmitting(true); - const res = await API.get(`/api/oauth/email/bind?email=${values.email}&code=${values.email_verification_code}`); - const { success, message } = res.data; - if (success) { - showSuccess('邮箱账户绑定成功!'); - setSubmitting(false); - setStatus({ success: true }); - handleClose(); - } else { - showError(message); - setErrors({ submit: message }); + try { + const res = await API.get(`/api/oauth/email/bind?email=${values.email}&code=${values.email_verification_code}`); + const { success, message } = res.data; + if (success) { + showSuccess('邮箱账户绑定成功!'); + setSubmitting(false); + setStatus({ success: true }); + handleClose(); + } else { + showError(message); + setErrors({ submit: message }); + } + } catch (error) { + console.log(error); } setLoading(false); }; @@ -69,7 +73,7 @@ const EmailModal = ({ open, handleClose, turnstileToken }) => { showError('请输入邮箱'); return; } - if (turnstileToken === '') { + if (turnstileEnabled && turnstileToken === '') { showError('请稍后几秒重试,Turnstile 正在检查用户环境!'); return; } @@ -168,5 +172,6 @@ export default EmailModal; EmailModal.propTypes = { open: PropTypes.bool, handleClose: PropTypes.func, - turnstileToken: PropTypes.string + turnstileToken: PropTypes.string, + turnstileEnabled: PropTypes.bool }; diff --git a/web/src/views/Profile/index.js b/web/src/views/Profile/index.js index 27e244d4..29e1ea6e 100644 --- a/web/src/views/Profile/index.js +++ b/web/src/views/Profile/index.js @@ -59,12 +59,16 @@ export default function Profile() { }; const loadUser = async () => { - let res = await API.get(`/api/user/self`); - const { success, message, data } = res.data; - if (success) { - setInputs(data); - } else { - showError(message); + try { + let res = await API.get(`/api/user/self`); + const { success, message, data } = res.data; + if (success) { + setInputs(data); + } else { + showError(message); + } + } catch (error) { + return; } }; @@ -84,17 +88,19 @@ export default function Profile() { }; const generateAccessToken = async () => { - const res = await API.get('/api/user/token'); - const { success, message, data } = res.data; - if (success) { - setInputs((inputs) => ({ ...inputs, access_token: data })); - navigator.clipboard.writeText(data); - showSuccess(`令牌已重置并已复制到剪贴板`); - } else { - showError(message); + try { + const res = await API.get('/api/user/token'); + const { success, message, data } = res.data; + if (success) { + setInputs((inputs) => ({ ...inputs, access_token: data })); + navigator.clipboard.writeText(data); + showSuccess(`令牌已重置并已复制到剪贴板`); + } else { + showError(message); + } + } catch (error) { + return; } - - console.log(turnstileEnabled, turnstileSiteKey, status); }; const submit = async () => { @@ -284,6 +290,7 @@ export default function Profile() { { setOpenEmail(false); }} diff --git a/web/src/views/Redemption/component/EditModal.js b/web/src/views/Redemption/component/EditModal.js index 5d3c45c6..c464c52f 100644 --- a/web/src/views/Redemption/component/EditModal.js +++ b/web/src/views/Redemption/component/EditModal.js @@ -46,42 +46,50 @@ const EditModal = ({ open, redemptiondId, onCancel, onOk }) => { setSubmitting(true); let res; - if (values.is_edit) { - res = await API.put(`/api/redemption/`, { ...values, id: parseInt(redemptiondId) }); - } else { - res = await API.post(`/api/redemption/`, values); - } - const { success, message, data } = res.data; - if (success) { + try { if (values.is_edit) { - showSuccess('兑换码更新成功!'); + res = await API.put(`/api/redemption/`, { ...values, id: parseInt(redemptiondId) }); } else { - showSuccess('兑换码创建成功!'); - if (data.length > 1) { - let text = ''; - for (let i = 0; i < data.length; i++) { - text += data[i] + '\n'; - } - downloadTextAsFile(text, `${values.name}.txt`); - } + res = await API.post(`/api/redemption/`, values); } - setSubmitting(false); - setStatus({ success: true }); - onOk(true); - } else { - showError(message); - setErrors({ submit: message }); + const { success, message, data } = res.data; + if (success) { + if (values.is_edit) { + showSuccess('兑换码更新成功!'); + } else { + showSuccess('兑换码创建成功!'); + if (data.length > 1) { + let text = ''; + for (let i = 0; i < data.length; i++) { + text += data[i] + '\n'; + } + downloadTextAsFile(text, `${values.name}.txt`); + } + } + setSubmitting(false); + setStatus({ success: true }); + onOk(true); + } else { + showError(message); + setErrors({ submit: message }); + } + } catch (error) { + return; } }; const loadRedemptiond = async () => { - let res = await API.get(`/api/redemption/${redemptiondId}`); - const { success, message, data } = res.data; - if (success) { - data.is_edit = true; - setInputs(data); - } else { - showError(message); + try { + let res = await API.get(`/api/redemption/${redemptiondId}`); + const { success, message, data } = res.data; + if (success) { + data.is_edit = true; + setInputs(data); + } else { + showError(message); + } + } catch (error) { + return; } }; diff --git a/web/src/views/Redemption/index.js b/web/src/views/Redemption/index.js index 436f1199..9842c079 100644 --- a/web/src/views/Redemption/index.js +++ b/web/src/views/Redemption/index.js @@ -30,18 +30,22 @@ export default function Redemption() { const loadRedemptions = async (startIdx) => { setSearching(true); - const res = await API.get(`/api/redemption/?p=${startIdx}`); - const { success, message, data } = res.data; - if (success) { - if (startIdx === 0) { - setRedemptions(data); + try { + const res = await API.get(`/api/redemption/?p=${startIdx}`); + const { success, message, data } = res.data; + if (success) { + if (startIdx === 0) { + setRedemptions(data); + } else { + let newRedemptions = [...redemptions]; + newRedemptions.splice(startIdx * ITEMS_PER_PAGE, data.length, ...data); + setRedemptions(newRedemptions); + } } else { - let newRedemptions = [...redemptions]; - newRedemptions.splice(startIdx * ITEMS_PER_PAGE, data.length, ...data); - setRedemptions(newRedemptions); + showError(message); } - } else { - showError(message); + } catch (error) { + console.log(error); } setSearching(false); }; @@ -64,14 +68,20 @@ export default function Redemption() { return; } setSearching(true); - const res = await API.get(`/api/redemption/search?keyword=${searchKeyword}`); - const { success, message, data } = res.data; - if (success) { - setRedemptions(data); - setActivePage(0); - } else { - showError(message); + + try { + const res = await API.get(`/api/redemption/search?keyword=${searchKeyword}`); + const { success, message, data } = res.data; + if (success) { + setRedemptions(data); + setActivePage(0); + } else { + showError(message); + } + } catch (error) { + console.log(error); } + setSearching(false); }; @@ -83,28 +93,33 @@ export default function Redemption() { const url = '/api/redemption/'; let data = { id }; let res; - switch (action) { - case 'delete': - res = await API.delete(url + id); - break; - case 'status': - res = await API.put(url + '?status_only=true', { - ...data, - status: value - }); - break; - } - const { success, message } = res.data; - if (success) { - showSuccess('操作成功完成!'); - if (action === 'delete') { - await loadRedemptions(0); - } - } else { - showError(message); - } - return res.data; + try { + switch (action) { + case 'delete': + res = await API.delete(url + id); + break; + case 'status': + res = await API.put(url + '?status_only=true', { + ...data, + status: value + }); + break; + } + const { success, message } = res.data; + if (success) { + showSuccess('操作成功完成!'); + if (action === 'delete') { + await loadRedemptions(0); + } + } else { + showError(message); + } + + return res.data; + } catch (error) { + return; + } }; // 处理刷新 diff --git a/web/src/views/Setting/component/OperationSetting.js b/web/src/views/Setting/component/OperationSetting.js index c23ec6dc..27af978c 100644 --- a/web/src/views/Setting/component/OperationSetting.js +++ b/web/src/views/Setting/component/OperationSetting.js @@ -36,20 +36,24 @@ const OperationSetting = () => { let [historyTimestamp, setHistoryTimestamp] = useState(now.getTime() / 1000 - 30 * 24 * 3600); // a month ago new Date().getTime() / 1000 + 3600 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); + try { + 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); + } + } catch (error) { + return; } }; @@ -62,16 +66,22 @@ const OperationSetting = () => { 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); + + try { + const res = await API.put('/api/option/', { + key, + value + }); + const { success, message } = res.data; + if (success) { + setInputs((inputs) => ({ ...inputs, [key]: value })); + } else { + showError(message); + } + } catch (error) { + return; } + setLoading(false); }; @@ -146,13 +156,17 @@ const OperationSetting = () => { }; const deleteHistoryLogs = async () => { - const res = await API.delete(`/api/log/?target_timestamp=${Math.floor(historyTimestamp)}`); - const { success, message, data } = res.data; - if (success) { - showSuccess(`${data} 条日志已清理!`); + try { + const res = await API.delete(`/api/log/?target_timestamp=${Math.floor(historyTimestamp)}`); + const { success, message, data } = res.data; + if (success) { + showSuccess(`${data} 条日志已清理!`); + return; + } + showError('日志清理失败:' + message); + } catch (error) { return; } - showError('日志清理失败:' + message); }; return ( diff --git a/web/src/views/Setting/component/OtherSetting.js b/web/src/views/Setting/component/OtherSetting.js index e3c7ebd4..6e36a3c0 100644 --- a/web/src/views/Setting/component/OtherSetting.js +++ b/web/src/views/Setting/component/OtherSetting.js @@ -36,18 +36,22 @@ const OtherSetting = () => { }); 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 in inputs) { - newInputs[item.key] = item.value; - } - }); - setInputs(newInputs); - } else { - showError(message); + try { + const res = await API.get('/api/option/'); + const { success, message, data } = res.data; + if (success) { + let newInputs = {}; + data.forEach((item) => { + if (item.key in inputs) { + newInputs[item.key] = item.value; + } + }); + setInputs(newInputs); + } else { + showError(message); + } + } catch (error) { + return; } }; @@ -58,18 +62,22 @@ const OtherSetting = () => { const updateOption = async (key, value) => { setLoading(true); - const res = await API.put('/api/option/', { - key, - value - }); - const { success, message } = res.data; - if (success) { - setInputs((inputs) => ({ ...inputs, [key]: value })); - showSuccess('保存成功'); - } else { - showError(message); + try { + const res = await API.put('/api/option/', { + key, + value + }); + const { success, message } = res.data; + if (success) { + setInputs((inputs) => ({ ...inputs, [key]: value })); + showSuccess('保存成功'); + } else { + showError(message); + } + setLoading(false); + } catch (error) { + return; } - setLoading(false); }; const handleInputChange = async (event) => { @@ -106,16 +114,20 @@ const OtherSetting = () => { }; const checkUpdate = async () => { - const res = await API.get('https://api.github.com/repos/MartialBE/one-api/releases/latest'); - const { tag_name, body } = res.data; - if (tag_name === process.env.REACT_APP_VERSION) { - showSuccess(`已是最新版本:${tag_name}`); - } else { - setUpdateData({ - tag_name: tag_name, - content: marked.parse(body) - }); - setShowUpdateModal(true); + try { + const res = await API.get('https://api.github.com/repos/MartialBE/one-api/releases/latest'); + const { tag_name, body } = res.data; + if (tag_name === process.env.REACT_APP_VERSION) { + showSuccess(`已是最新版本:${tag_name}`); + } else { + setUpdateData({ + tag_name: tag_name, + content: marked.parse(body) + }); + setShowUpdateModal(true); + } + } catch (error) { + return; } }; diff --git a/web/src/views/Setting/component/SystemSetting.js b/web/src/views/Setting/component/SystemSetting.js index fcf062a3..948be6e2 100644 --- a/web/src/views/Setting/component/SystemSetting.js +++ b/web/src/views/Setting/component/SystemSetting.js @@ -56,22 +56,26 @@ const SystemSetting = () => { const [showPasswordWarningModal, setShowPasswordWarningModal] = 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) => { - newInputs[item.key] = item.value; - }); - setInputs({ - ...newInputs, - EmailDomainWhitelist: newInputs.EmailDomainWhitelist.split(',') - }); - setOriginInputs(newInputs); + try { + const res = await API.get('/api/option/'); + const { success, message, data } = res.data; + if (success) { + let newInputs = {}; + data.forEach((item) => { + newInputs[item.key] = item.value; + }); + setInputs({ + ...newInputs, + EmailDomainWhitelist: newInputs.EmailDomainWhitelist.split(',') + }); + setOriginInputs(newInputs); - setEmailDomainWhitelist(newInputs.EmailDomainWhitelist.split(',')); - } else { - showError(message); + setEmailDomainWhitelist(newInputs.EmailDomainWhitelist.split(',')); + } else { + showError(message); + } + } catch (error) { + return; } }; @@ -95,23 +99,29 @@ const SystemSetting = () => { default: break; } - const res = await API.put('/api/option/', { - key, - value - }); - const { success, message } = res.data; - if (success) { - if (key === 'EmailDomainWhitelist') { - value = value.split(','); + + try { + const res = await API.put('/api/option/', { + key, + value + }); + const { success, message } = res.data; + if (success) { + if (key === 'EmailDomainWhitelist') { + value = value.split(','); + } + setInputs((inputs) => ({ + ...inputs, + [key]: value + })); + showSuccess('设置成功!'); + } else { + showError(message); } - setInputs((inputs) => ({ - ...inputs, - [key]: value - })); - showSuccess('设置成功!'); - } else { - showError(message); + } catch (error) { + return; } + setLoading(false); }; diff --git a/web/src/views/Token/component/EditModal.js b/web/src/views/Token/component/EditModal.js index d0d277d5..9fa23ccc 100644 --- a/web/src/views/Token/component/EditModal.js +++ b/web/src/views/Token/component/EditModal.js @@ -52,35 +52,44 @@ const EditModal = ({ open, tokenId, onCancel, onOk }) => { values.remain_quota = parseInt(values.remain_quota); let res; - if (values.is_edit) { - res = await API.put(`/api/token/`, { ...values, id: parseInt(tokenId) }); - } else { - res = await API.post(`/api/token/`, values); - } - const { success, message } = res.data; - if (success) { + + try { if (values.is_edit) { - showSuccess('令牌更新成功!'); + res = await API.put(`/api/token/`, { ...values, id: parseInt(tokenId) }); } else { - showSuccess('令牌创建成功,请在列表页面点击复制获取令牌!'); + res = await API.post(`/api/token/`, values); } - setSubmitting(false); - setStatus({ success: true }); - onOk(true); - } else { - showError(message); - setErrors({ submit: message }); + const { success, message } = res.data; + if (success) { + if (values.is_edit) { + showSuccess('令牌更新成功!'); + } else { + showSuccess('令牌创建成功,请在列表页面点击复制获取令牌!'); + } + setSubmitting(false); + setStatus({ success: true }); + onOk(true); + } else { + showError(message); + setErrors({ submit: message }); + } + } catch (error) { + return; } }; const loadToken = async () => { - let res = await API.get(`/api/token/${tokenId}`); - const { success, message, data } = res.data; - if (success) { - data.is_edit = true; - setInputs(data); - } else { - showError(message); + try { + let res = await API.get(`/api/token/${tokenId}`); + const { success, message, data } = res.data; + if (success) { + data.is_edit = true; + setInputs(data); + } else { + showError(message); + } + } catch (error) { + return; } }; diff --git a/web/src/views/Token/index.js b/web/src/views/Token/index.js index 03daaedb..c521882c 100644 --- a/web/src/views/Token/index.js +++ b/web/src/views/Token/index.js @@ -32,19 +32,24 @@ export default function Token() { const loadTokens = async (startIdx) => { setSearching(true); - const res = await API.get(`/api/token/?p=${startIdx}`); - const { success, message, data } = res.data; - if (success) { - if (startIdx === 0) { - setTokens(data); + try { + const res = await API.get(`/api/token/?p=${startIdx}`); + const { success, message, data } = res.data; + if (success) { + if (startIdx === 0) { + setTokens(data); + } else { + let newTokens = [...tokens]; + newTokens.splice(startIdx * ITEMS_PER_PAGE, data.length, ...data); + setTokens(newTokens); + } } else { - let newTokens = [...tokens]; - newTokens.splice(startIdx * ITEMS_PER_PAGE, data.length, ...data); - setTokens(newTokens); + showError(message); } - } else { - showError(message); + } catch (error) { + console.log(error); } + setSearching(false); }; @@ -75,14 +80,20 @@ export default function Token() { return; } setSearching(true); - const res = await API.get(`/api/token/search?keyword=${searchKeyword}`); - const { success, message, data } = res.data; - if (success) { - setTokens(data); - setActivePage(0); - } else { - showError(message); + + try { + const res = await API.get(`/api/token/search?keyword=${searchKeyword}`); + const { success, message, data } = res.data; + if (success) { + setTokens(data); + setActivePage(0); + } else { + showError(message); + } + } catch (error) { + return; } + setSearching(false); }; @@ -94,28 +105,32 @@ export default function Token() { const url = '/api/token/'; let data = { id }; let res; - switch (action) { - case 'delete': - res = await API.delete(url + id); - break; - case 'status': - res = await API.put(url + `?status_only=true`, { - ...data, - status: value - }); - break; - } - const { success, message } = res.data; - if (success) { - showSuccess('操作成功完成!'); - if (action === 'delete') { - await handleRefresh(); + try { + switch (action) { + case 'delete': + res = await API.delete(url + id); + break; + case 'status': + res = await API.put(url + `?status_only=true`, { + ...data, + status: value + }); + break; + } + const { success, message } = res.data; + if (success) { + showSuccess('操作成功完成!'); + if (action === 'delete') { + await handleRefresh(); + } + } else { + showError(message); } - } else { - showError(message); - } - return res.data; + return res.data; + } catch (error) { + return; + } }; // 处理刷新 diff --git a/web/src/views/Topup/component/InviteCard.js b/web/src/views/Topup/component/InviteCard.js index 2cea4855..a7ab82e8 100644 --- a/web/src/views/Topup/component/InviteCard.js +++ b/web/src/views/Topup/component/InviteCard.js @@ -16,15 +16,20 @@ const InviteCard = () => { showSuccess(`邀请链接已复制到剪切板`); return; } - const res = await API.get('/api/user/aff'); - const { success, message, data } = res.data; - if (success) { - let link = `${window.location.origin}/register?aff=${data}`; - setInviteUrl(link); - navigator.clipboard.writeText(link); - showSuccess(`邀请链接已复制到剪切板`); - } else { - showError(message); + + try { + const res = await API.get('/api/user/aff'); + const { success, message, data } = res.data; + if (success) { + let link = `${window.location.origin}/register?aff=${data}`; + setInviteUrl(link); + navigator.clipboard.writeText(link); + showSuccess(`邀请链接已复制到剪切板`); + } else { + showError(message); + } + } catch (error) { + return; } }; diff --git a/web/src/views/Topup/component/TopupCard.js b/web/src/views/Topup/component/TopupCard.js index bd4fe00d..0478f976 100644 --- a/web/src/views/Topup/component/TopupCard.js +++ b/web/src/views/Topup/component/TopupCard.js @@ -51,12 +51,16 @@ const TopupCard = () => { }; const getUserQuota = async () => { - let res = await API.get(`/api/user/self`); - const { success, message, data } = res.data; - if (success) { - setUserQuota(data.quota); - } else { - showError(message); + try { + let res = await API.get(`/api/user/self`); + const { success, message, data } = res.data; + if (success) { + setUserQuota(data.quota); + } else { + showError(message); + } + } catch (error) { + return; } }; diff --git a/web/src/views/User/component/EditModal.js b/web/src/views/User/component/EditModal.js index 8de37345..f494e868 100644 --- a/web/src/views/User/component/EditModal.js +++ b/web/src/views/User/component/EditModal.js @@ -66,24 +66,29 @@ const EditModal = ({ open, userId, onCancel, onOk }) => { setSubmitting(true); let res; - if (values.is_edit) { - res = await API.put(`/api/user/`, { ...values, id: parseInt(userId) }); - } else { - res = await API.post(`/api/user/`, values); - } - const { success, message } = res.data; - if (success) { + + try { if (values.is_edit) { - showSuccess('用户更新成功!'); + res = await API.put(`/api/user/`, { ...values, id: parseInt(userId) }); } else { - showSuccess('用户创建成功!'); + res = await API.post(`/api/user/`, values); } - setSubmitting(false); - setStatus({ success: true }); - onOk(true); - } else { - showError(message); - setErrors({ submit: message }); + const { success, message } = res.data; + if (success) { + if (values.is_edit) { + showSuccess('用户更新成功!'); + } else { + showSuccess('用户创建成功!'); + } + setSubmitting(false); + setStatus({ success: true }); + onOk(true); + } else { + showError(message); + setErrors({ submit: message }); + } + } catch (error) { + return; } }; @@ -96,13 +101,17 @@ const EditModal = ({ open, userId, onCancel, onOk }) => { }; const loadUser = async () => { - let res = await API.get(`/api/user/${userId}`); - const { success, message, data } = res.data; - if (success) { - data.is_edit = true; - setInputs(data); - } else { - showError(message); + try { + let res = await API.get(`/api/user/${userId}`); + const { success, message, data } = res.data; + if (success) { + data.is_edit = true; + setInputs(data); + } else { + showError(message); + } + } catch (error) { + return; } }; diff --git a/web/src/views/User/index.js b/web/src/views/User/index.js index da65abeb..1983992f 100644 --- a/web/src/views/User/index.js +++ b/web/src/views/User/index.js @@ -30,20 +30,25 @@ export default function Users() { const loadUsers = async (startIdx) => { setSearching(true); - const res = await API.get(`/api/user/?p=${startIdx}`); - const { success, message, data } = res.data; - if (success) { - if (startIdx === 0) { - setUsers(data); + try { + const res = await API.get(`/api/user/?p=${startIdx}`); + const { success, message, data } = res.data; + if (success) { + if (startIdx === 0) { + setUsers(data); + } else { + let newUsers = [...users]; + newUsers.splice(startIdx * ITEMS_PER_PAGE, data.length, ...data); + setUsers(newUsers); + } } else { - let newUsers = [...users]; - newUsers.splice(startIdx * ITEMS_PER_PAGE, data.length, ...data); - setUsers(newUsers); + showError(message); } - } else { - showError(message); + setSearching(false); + } catch (error) { + setSearching(false); + return; } - setSearching(false); }; const onPaginationChange = (event, activePage) => { @@ -64,15 +69,20 @@ export default function Users() { return; } setSearching(true); - const res = await API.get(`/api/user/search?keyword=${searchKeyword}`); - const { success, message, data } = res.data; - if (success) { - setUsers(data); - setActivePage(0); - } else { - showError(message); + try { + const res = await API.get(`/api/user/search?keyword=${searchKeyword}`); + const { success, message, data } = res.data; + if (success) { + setUsers(data); + setActivePage(0); + } else { + showError(message); + } + setSearching(false); + } catch (error) { + setSearching(false); + return; } - setSearching(false); }; const handleSearchKeyword = (event) => { @@ -95,16 +105,20 @@ export default function Users() { break; } - res = await API.post(url, data); - const { success, message } = res.data; - if (success) { - showSuccess('操作成功完成!'); - await loadUsers(activePage); - } else { - showError(message); - } + try { + res = await API.post(url, data); + const { success, message } = res.data; + if (success) { + showSuccess('操作成功完成!'); + await loadUsers(activePage); + } else { + showError(message); + } - return res.data; + return res.data; + } catch (error) { + return; + } }; // 处理刷新