| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| import React, { useEffect, useState, useContext } from 'react';
|
| import {
|
| Button,
|
| Card,
|
| Col,
|
| Form,
|
| Row,
|
| Switch,
|
| Typography,
|
| } from '@douyinfe/semi-ui';
|
| import { API, showError, showSuccess } from '../../../helpers';
|
| import { useTranslation } from 'react-i18next';
|
| import { StatusContext } from '../../../context/Status';
|
|
|
| const { Text } = Typography;
|
|
|
| export default function SettingsHeaderNavModules(props) {
|
| const { t } = useTranslation();
|
| const [loading, setLoading] = useState(false);
|
| const [statusState, statusDispatch] = useContext(StatusContext);
|
|
|
|
|
| const [headerNavModules, setHeaderNavModules] = useState({
|
| home: true,
|
| console: true,
|
| pricing: {
|
| enabled: true,
|
| requireAuth: false,
|
| },
|
| docs: true,
|
| about: true,
|
| });
|
|
|
|
|
| function handleHeaderNavModuleChange(moduleKey) {
|
| return (checked) => {
|
| const newModules = { ...headerNavModules };
|
| if (moduleKey === 'pricing') {
|
|
|
| newModules[moduleKey] = {
|
| ...newModules[moduleKey],
|
| enabled: checked,
|
| };
|
| } else {
|
| newModules[moduleKey] = checked;
|
| }
|
| setHeaderNavModules(newModules);
|
| };
|
| }
|
|
|
|
|
| function handlePricingAuthChange(checked) {
|
| const newModules = { ...headerNavModules };
|
| newModules.pricing = {
|
| ...newModules.pricing,
|
| requireAuth: checked,
|
| };
|
| setHeaderNavModules(newModules);
|
| }
|
|
|
|
|
| function resetHeaderNavModules() {
|
| const defaultModules = {
|
| home: true,
|
| console: true,
|
| pricing: {
|
| enabled: true,
|
| requireAuth: false,
|
| },
|
| docs: true,
|
| about: true,
|
| };
|
| setHeaderNavModules(defaultModules);
|
| showSuccess(t('已重置为默认配置'));
|
| }
|
|
|
|
|
| async function onSubmit() {
|
| setLoading(true);
|
| try {
|
| const res = await API.put('/api/option/', {
|
| key: 'HeaderNavModules',
|
| value: JSON.stringify(headerNavModules),
|
| });
|
| const { success, message } = res.data;
|
| if (success) {
|
| showSuccess(t('保存成功'));
|
|
|
|
|
| statusDispatch({
|
| type: 'set',
|
| payload: {
|
| ...statusState.status,
|
| HeaderNavModules: JSON.stringify(headerNavModules),
|
| },
|
| });
|
|
|
|
|
| if (props.refresh) {
|
| await props.refresh();
|
| }
|
| } else {
|
| showError(message);
|
| }
|
| } catch (error) {
|
| showError(t('保存失败,请重试'));
|
| } finally {
|
| setLoading(false);
|
| }
|
| }
|
|
|
| useEffect(() => {
|
|
|
| if (props.options && props.options.HeaderNavModules) {
|
| try {
|
| const modules = JSON.parse(props.options.HeaderNavModules);
|
|
|
|
|
| if (typeof modules.pricing === 'boolean') {
|
| modules.pricing = {
|
| enabled: modules.pricing,
|
| requireAuth: false,
|
| };
|
| }
|
|
|
| setHeaderNavModules(modules);
|
| } catch (error) {
|
|
|
| const defaultModules = {
|
| home: true,
|
| console: true,
|
| pricing: {
|
| enabled: true,
|
| requireAuth: false,
|
| },
|
| docs: true,
|
| about: true,
|
| };
|
| setHeaderNavModules(defaultModules);
|
| }
|
| }
|
| }, [props.options]);
|
|
|
|
|
| const moduleConfigs = [
|
| {
|
| key: 'home',
|
| title: t('首页'),
|
| description: t('用户主页,展示系统信息'),
|
| },
|
| {
|
| key: 'console',
|
| title: t('控制台'),
|
| description: t('用户控制面板,管理账户'),
|
| },
|
| {
|
| key: 'pricing',
|
| title: t('模型广场'),
|
| description: t('模型定价,需要登录访问'),
|
| hasSubConfig: true,
|
| },
|
| {
|
| key: 'docs',
|
| title: t('文档'),
|
| description: t('系统文档和帮助信息'),
|
| },
|
| {
|
| key: 'about',
|
| title: t('关于'),
|
| description: t('关于系统的详细信息'),
|
| },
|
| ];
|
|
|
| return (
|
| <Card>
|
| <Form.Section
|
| text={t('顶栏管理')}
|
| extraText={t('控制顶栏模块显示状态,全局生效')}
|
| >
|
| <Row gutter={[16, 16]} style={{ marginBottom: '24px' }}>
|
| {moduleConfigs.map((module) => (
|
| <Col key={module.key} xs={24} sm={12} md={6} lg={6} xl={6}>
|
| <Card
|
| style={{
|
| borderRadius: '8px',
|
| border: '1px solid var(--semi-color-border)',
|
| transition: 'all 0.2s ease',
|
| background: 'var(--semi-color-bg-1)',
|
| minHeight: '80px',
|
| }}
|
| bodyStyle={{ padding: '16px' }}
|
| hoverable
|
| >
|
| <div
|
| style={{
|
| display: 'flex',
|
| justifyContent: 'space-between',
|
| alignItems: 'center',
|
| height: '100%',
|
| }}
|
| >
|
| <div style={{ flex: 1, textAlign: 'left' }}>
|
| <div
|
| style={{
|
| fontWeight: '600',
|
| fontSize: '14px',
|
| color: 'var(--semi-color-text-0)',
|
| marginBottom: '4px',
|
| }}
|
| >
|
| {module.title}
|
| </div>
|
| <Text
|
| type='secondary'
|
| size='small'
|
| style={{
|
| fontSize: '12px',
|
| color: 'var(--semi-color-text-2)',
|
| lineHeight: '1.4',
|
| display: 'block',
|
| }}
|
| >
|
| {module.description}
|
| </Text>
|
| </div>
|
| <div style={{ marginLeft: '16px' }}>
|
| <Switch
|
| checked={
|
| module.key === 'pricing'
|
| ? headerNavModules[module.key]?.enabled
|
| : headerNavModules[module.key]
|
| }
|
| onChange={handleHeaderNavModuleChange(module.key)}
|
| size='default'
|
| />
|
| </div>
|
| </div>
|
|
|
| {/* 为模型广场添加权限控制子开关 */}
|
| {module.key === 'pricing' &&
|
| (module.key === 'pricing'
|
| ? headerNavModules[module.key]?.enabled
|
| : headerNavModules[module.key]) && (
|
| <div
|
| style={{
|
| borderTop: '1px solid var(--semi-color-border)',
|
| marginTop: '12px',
|
| paddingTop: '12px',
|
| }}
|
| >
|
| <div
|
| style={{
|
| display: 'flex',
|
| justifyContent: 'space-between',
|
| alignItems: 'center',
|
| }}
|
| >
|
| <div style={{ flex: 1, textAlign: 'left' }}>
|
| <div
|
| style={{
|
| fontWeight: '500',
|
| fontSize: '12px',
|
| color: 'var(--semi-color-text-1)',
|
| marginBottom: '2px',
|
| }}
|
| >
|
| {t('需要登录访问')}
|
| </div>
|
| <Text
|
| type='secondary'
|
| size='small'
|
| style={{
|
| fontSize: '11px',
|
| color: 'var(--semi-color-text-2)',
|
| lineHeight: '1.4',
|
| display: 'block',
|
| }}
|
| >
|
| {t('开启后未登录用户无法访问模型广场')}
|
| </Text>
|
| </div>
|
| <div style={{ marginLeft: '16px' }}>
|
| <Switch
|
| checked={
|
| headerNavModules.pricing?.requireAuth || false
|
| }
|
| onChange={handlePricingAuthChange}
|
| size='default'
|
| />
|
| </div>
|
| </div>
|
| </div>
|
| )}
|
| </Card>
|
| </Col>
|
| ))}
|
| </Row>
|
|
|
| <div
|
| style={{
|
| display: 'flex',
|
| gap: '12px',
|
| justifyContent: 'flex-start',
|
| alignItems: 'center',
|
| paddingTop: '8px',
|
| borderTop: '1px solid var(--semi-color-border)',
|
| }}
|
| >
|
| <Button
|
| size='default'
|
| type='tertiary'
|
| onClick={resetHeaderNavModules}
|
| style={{
|
| borderRadius: '6px',
|
| fontWeight: '500',
|
| }}
|
| >
|
| {t('重置为默认')}
|
| </Button>
|
| <Button
|
| size='default'
|
| type='primary'
|
| onClick={onSubmit}
|
| loading={loading}
|
| style={{
|
| borderRadius: '6px',
|
| fontWeight: '500',
|
| minWidth: '100px',
|
| }}
|
| >
|
| {t('保存设置')}
|
| </Button>
|
| </div>
|
| </Form.Section>
|
| </Card>
|
| );
|
| }
|
|
|