diff --git a/web/src/components/settings/PersonalSetting.js b/web/src/components/settings/PersonalSetting.js index 935143ab..50bca76e 100644 --- a/web/src/components/settings/PersonalSetting.js +++ b/web/src/components/settings/PersonalSetting.js @@ -104,6 +104,33 @@ const PersonalSetting = () => { }); const [modelsLoading, setModelsLoading] = useState(true); const [showWebhookDocs, setShowWebhookDocs] = useState(true); + const [isDarkMode, setIsDarkMode] = useState(false); + + // 检测暗色模式 + useEffect(() => { + const checkDarkMode = () => { + const isDark = document.documentElement.classList.contains('dark') || + window.matchMedia('(prefers-color-scheme: dark)').matches; + setIsDarkMode(isDark); + }; + + checkDarkMode(); + + // 监听主题变化 + const observer = new MutationObserver(checkDarkMode); + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['class'] + }); + + const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); + mediaQuery.addListener(checkDarkMode); + + return () => { + observer.disconnect(); + mediaQuery.removeListener(checkDarkMode); + }; + }, []); useEffect(() => { let status = localStorage.getItem('status'); @@ -384,107 +411,81 @@ const PersonalSetting = () => { {/* 顶部用户信息区域 */} {/* 装饰性背景元素 */}
-
-
-
+
+
+
-
+
{getAvatarText()}
-
+
{getUsername()}
{isRoot() ? ( {t('超级管理员')} ) : isAdmin() ? ( {t('管理员')} ) : ( {t('普通用户')} )} ID: {userState?.user?.id}
-
- +
+
-
+
{t('当前余额')}
-
+
{renderQuota(userState?.user?.quota)}
@@ -492,33 +493,33 @@ const PersonalSetting = () => {
-
+
{t('历史消耗')}
-
+
{renderQuota(userState?.user?.used_quota)}
-
+
{t('请求次数')}
-
+
{userState.user?.request_count || 0}
-
+
{t('用户分组')}
-
+
{userState?.user?.group || t('默认')}
-
+
@@ -537,10 +538,10 @@ const PersonalSetting = () => { >
{/* 可用模型部分 */} -
+
-
- +
+
{t('模型列表')} @@ -629,7 +630,7 @@ const PersonalSetting = () => {
-
+
{(() => { // 根据当前选中的分类过滤模型 const categories = getModelCategories(t); @@ -736,9 +737,9 @@ const PersonalSetting = () => { shadows='hover' >
-
-
- +
+
+
{t('邮箱')}
@@ -771,8 +772,8 @@ const PersonalSetting = () => { >
-
- +
+
{t('微信')}
@@ -808,8 +809,8 @@ const PersonalSetting = () => { >
-
- +
+
{t('GitHub')}
@@ -844,8 +845,8 @@ const PersonalSetting = () => { >
-
- +
+
{t('OIDC')}
@@ -883,8 +884,8 @@ const PersonalSetting = () => { >
-
- +
+
{t('Telegram')}
@@ -926,8 +927,8 @@ const PersonalSetting = () => { >
-
- +
+
{t('LinuxDO')}
@@ -978,8 +979,8 @@ const PersonalSetting = () => { >
-
- +
+
@@ -1006,7 +1007,7 @@ const PersonalSetting = () => { type="primary" theme="solid" onClick={generateAccessToken} - className="!rounded-lg !bg-blue-500 hover:!bg-blue-600 w-full sm:w-auto" + className="!rounded-lg !bg-slate-600 hover:!bg-slate-700 w-full sm:w-auto" icon={} > {systemToken ? t('重新生成') : t('生成令牌')} @@ -1022,8 +1023,8 @@ const PersonalSetting = () => { >
-
- +
+
@@ -1038,7 +1039,7 @@ const PersonalSetting = () => { type="primary" theme="solid" onClick={() => setShowChangePasswordModal(true)} - className="!rounded-lg !bg-orange-500 hover:!bg-orange-600 w-full sm:w-auto" + className="!rounded-lg !bg-slate-600 hover:!bg-slate-700 w-full sm:w-auto" icon={} > {t('修改密码')} @@ -1054,11 +1055,11 @@ const PersonalSetting = () => { >
-
- +
+
- + {t('删除账户')} @@ -1070,7 +1071,7 @@ const PersonalSetting = () => { type="danger" theme="solid" onClick={() => setShowAccountDeleteModal(true)} - className="!rounded-lg w-full sm:w-auto" + className="!rounded-lg w-full sm:w-auto !bg-slate-500 hover:!bg-slate-600" icon={} > {t('删除账户')} @@ -1111,7 +1112,7 @@ const PersonalSetting = () => { >
- +
{t('邮件通知')}
{t('通过邮件接收通知')}
@@ -1120,7 +1121,7 @@ const PersonalSetting = () => {
- +
{t('Webhook通知')}
{t('通过HTTP请求接收通知')}
@@ -1167,11 +1168,11 @@ const PersonalSetting = () => {
-
+
setShowWebhookDocs(!showWebhookDocs)}>
- - + + {t('Webhook请求结构')}
@@ -1254,11 +1255,11 @@ const PersonalSetting = () => { itemKey='price' >
-
-
-
- -
+
+
+
+ +
@@ -1292,7 +1293,7 @@ const PersonalSetting = () => { type='primary' onClick={saveNotificationSettings} size="large" - className="!rounded-lg !bg-purple-500 hover:!bg-purple-600" + className="!rounded-lg !bg-slate-600 hover:!bg-slate-700" icon={} > {t('保存设置')} @@ -1408,7 +1409,7 @@ const PersonalSetting = () => { theme="solid" size='large' onClick={bindWeChat} - className="!rounded-lg w-full !bg-green-500 hover:!bg-green-600" + className="!rounded-lg w-full !bg-slate-600 hover:!bg-slate-700" icon={} > {t('绑定')} diff --git a/web/src/helpers/render.js b/web/src/helpers/render.js index 5d3e0e81..3e3f5831 100644 --- a/web/src/helpers/render.js +++ b/web/src/helpers/render.js @@ -580,7 +580,7 @@ export function renderText(text, limit) { export function renderGroup(group) { if (group === '') { return ( - }> + {i18next.t('用户分组')} ); @@ -603,7 +603,6 @@ export function renderGroup(group) { color={tagColors[group] || stringToColor(group)} key={group} shape='circle' - prefixIcon={} onClick={async (event) => { event.stopPropagation(); if (await copy(group)) { diff --git a/web/src/pages/TopUp/index.js b/web/src/pages/TopUp/index.js index bff83791..69d940b7 100644 --- a/web/src/pages/TopUp/index.js +++ b/web/src/pages/TopUp/index.js @@ -55,6 +55,7 @@ const TopUp = () => { const [amountLoading, setAmountLoading] = useState(false); const [paymentLoading, setPaymentLoading] = useState(false); const [confirmLoading, setConfirmLoading] = useState(false); + const [isDarkMode, setIsDarkMode] = useState(false); // 邀请相关状态 const [affLink, setAffLink] = useState(''); @@ -256,6 +257,32 @@ const TopUp = () => { showSuccess(t('邀请链接已复制到剪切板')); }; + // 检测暗色模式 + useEffect(() => { + const checkDarkMode = () => { + const isDark = document.documentElement.classList.contains('dark') || + window.matchMedia('(prefers-color-scheme: dark)').matches; + setIsDarkMode(isDark); + }; + + checkDarkMode(); + + // 监听主题变化 + const observer = new MutationObserver(checkDarkMode); + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['class'] + }); + + const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); + mediaQuery.addListener(checkDarkMode); + + return () => { + observer.disconnect(); + mediaQuery.removeListener(checkDarkMode); + }; + }, []); + useEffect(() => { if (userState?.user?.id) { setUserDataLoading(false); @@ -398,48 +425,45 @@ const TopUp = () => {
-
-
-
+
+
+
-
+
{userDataLoading ? ( ) : ( -
+
{t('尊敬的')} {getUsername()}
)}
-
- +
+
-
+
{t('当前余额')}
{userDataLoading ? ( ) : ( -
+
{renderQuota(userState?.user?.quota || userQuota)}
)} @@ -448,37 +472,37 @@ const TopUp = () => {
-
+
{t('历史消耗')}
{userDataLoading ? ( ) : ( -
+
{renderQuota(userState?.user?.used_quota || 0)}
)}
-
+
{t('用户分组')}
{userDataLoading ? ( ) : ( -
+
{userState?.user?.group || t('默认')}
)}
-
+
{t('用户角色')}
{userDataLoading ? ( ) : ( -
+
{getUserRole()}
)} @@ -489,32 +513,187 @@ const TopUp = () => { {userDataLoading ? ( ) : ( -
+
ID: {userState?.user?.id || '---'}
)}
-
+
- {/* 邀请信息部分 */} -
+ {/* 左侧:在线充值和兑换余额 */} +
+ {/* 在线充值部分 */} +
+
+
+ +
+
+ {t('在线充值')} +
{t('支持多种支付方式')}
+
+
+ +
+
+
+ {t('充值数量')} + {amountLoading ? ( + + ) : ( + {t('实付金额:') + ' ' + renderAmount()} + )} +
+ { + if (value && value >= 1) { + setTopUpCount(value); + await getAmount(value); + } + }} + onBlur={(e) => { + const value = parseInt(e.target.value); + if (!value || value < 1) { + setTopUpCount(1); + getAmount(1); + } + }} + size="large" + className="!rounded-lg w-full" + prefix={} + formatter={(value) => value ? `${value}` : ''} + parser={(value) => value ? parseInt(value.replace(/[^\d]/g, '')) : 0} + /> +
+ +
+ + +
+ + {!enableOnlineTopUp && ( + + {t('在线充值功能未开启')} +
+ } + description={ +
+ {t('管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。')} +
+ } + /> + )} +
+
+ + {/* 兑换余额部分 */} +
+
+
+ +
+
+ {t('兑换余额')} +
{t('使用兑换码充值余额')}
+
+
+ +
+
+ {t('兑换码')} + setRedemptionCode(value)} + size="large" + className="!rounded-lg" + prefix={} + /> +
+ +
+ {topUpLink && ( + + )} + +
+
+
+
+ + {/* 右侧:邀请信息部分 */} +
-
- +
+
@@ -524,7 +703,7 @@ const TopUp = () => { theme="solid" onClick={() => setOpenTransfer(true)} size="small" - className="!rounded-lg !bg-blue-500 hover:!bg-blue-600" + className="!rounded-lg !bg-slate-600 hover:!bg-slate-700" icon={} > {t('划转')} @@ -536,7 +715,7 @@ const TopUp = () => {
-
+
{
{renderQuota(userState?.user?.aff_quota)}
-
{
-
-
-
- -
-
- {t('兑换余额')} -
{t('使用兑换码充值余额')}
-
-
- -
-
- {t('兑换码')} - setRedemptionCode(value)} - size="large" - className="!rounded-lg" - prefix={} - /> -
- -
- {topUpLink && ( - - )} - -
-
-
- -
-
-
- -
-
- {t('在线充值')} -
{t('支持多种支付方式')}
-
-
- -
-
-
- {t('充值数量')} - {amountLoading ? ( - - ) : ( - {t('实付金额:') + ' ' + renderAmount()} - )} -
- { - if (value && value >= 1) { - setTopUpCount(value); - await getAmount(value); - } - }} - onBlur={(e) => { - const value = parseInt(e.target.value); - if (!value || value < 1) { - setTopUpCount(1); - getAmount(1); - } - }} - size="large" - className="!rounded-lg w-full" - prefix={} - formatter={(value) => value ? `${value}` : ''} - parser={(value) => value ? parseInt(value.replace(/[^\d]/g, '')) : 0} - /> -
- -
- - -
- - {!enableOnlineTopUp && ( - - {t('在线充值功能未开启')} -
- } - description={ -
- {t('管理员未开启在线充值功能,请联系管理员开启或使用兑换码充值。')} -
- } - /> - )} -
-