This commit is contained in:
eeee0717 2025-02-27 22:42:40 +08:00 committed by 亢奋猫
parent 2ab8f325df
commit acc803aa43
3 changed files with 27 additions and 17 deletions

View File

@ -10,6 +10,7 @@ import {
} from '@ant-design/icons' } from '@ant-design/icons'
import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar' import { Navbar, NavbarCenter } from '@renderer/components/app/Navbar'
import { isLocalAi } from '@renderer/config/env' import { isLocalAi } from '@renderer/config/env'
import ModelSettings from '@renderer/pages/settings/ModelSettings/ModelSettings'
import { FC } from 'react' import { FC } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { Link, Route, Routes, useLocation } from 'react-router-dom' import { Link, Route, Routes, useLocation } from 'react-router-dom'
@ -19,7 +20,6 @@ import AboutSettings from './AboutSettings'
import DataSettings from './DataSettings/DataSettings' import DataSettings from './DataSettings/DataSettings'
import DisplaySettings from './DisplaySettings/DisplaySettings' import DisplaySettings from './DisplaySettings/DisplaySettings'
import GeneralSettings from './GeneralSettings' import GeneralSettings from './GeneralSettings'
import ModelSettings from '@renderer/pages/settings/ModelSettings/ModelSettings'
import ProvidersList from './ProviderSettings' import ProvidersList from './ProviderSettings'
import QuickAssistantSettings from './QuickAssistantSettings' import QuickAssistantSettings from './QuickAssistantSettings'
import ShortcutSettings from './ShortcutSettings' import ShortcutSettings from './ShortcutSettings'

View File

@ -6,7 +6,7 @@ import { useWebSearchProvider } from '@renderer/hooks/useWebSearchProviders'
import { useAppDispatch, useAppSelector } from '@renderer/store' import { useAppDispatch, useAppSelector } from '@renderer/store'
import { setExcludeDomains, setMaxResult, setSearchWithTime } from '@renderer/store/websearch' import { setExcludeDomains, setMaxResult, setSearchWithTime } from '@renderer/store/websearch'
import { formatDomains } from '@renderer/utils/blacklist' import { formatDomains } from '@renderer/utils/blacklist'
import { Alert, Input, Slider, Switch, Typography } from 'antd' import { Alert, Button, Input, Slider, Switch, Typography } from 'antd'
import TextArea from 'antd/es/input/TextArea' import TextArea from 'antd/es/input/TextArea'
import { FC, useEffect, useState } from 'react' import { FC, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
@ -113,11 +113,11 @@ const WebSearchSettings: FC = () => {
<TextArea <TextArea
value={blacklistInput} value={blacklistInput}
onChange={(e) => setBlacklistInput(e.target.value)} onChange={(e) => setBlacklistInput(e.target.value)}
onBlur={() => updateManualBlacklist(blacklistInput)}
placeholder={t('settings.websearch.blacklist_tooltip')} placeholder={t('settings.websearch.blacklist_tooltip')}
autoSize={{ minRows: 2, maxRows: 6 }} autoSize={{ minRows: 4, maxRows: 8 }}
rows={4} rows={4}
/> />
<Button onClick={() => updateManualBlacklist(blacklistInput)}>{t('common.save')}</Button>
{errFormat && <Alert message={t('settings.websearch.blacklist_tooltip')} type="error" />} {errFormat && <Alert message={t('settings.websearch.blacklist_tooltip')} type="error" />}
</SettingGroup> </SettingGroup>
</SettingContainer> </SettingContainer>

View File

@ -2,7 +2,6 @@ interface FormatDomainsResult {
formattedDomains: string[] formattedDomains: string[]
hasError: boolean hasError: boolean
} }
export function formatDomains(urls: string[]): FormatDomainsResult { export function formatDomains(urls: string[]): FormatDomainsResult {
let hasError = false let hasError = false
const formattedDomains: string[] = [] const formattedDomains: string[] = []
@ -16,13 +15,29 @@ export function formatDomains(urls: string[]): FormatDomainsResult {
modifiedUrlString = modifiedUrlString.substring(4) modifiedUrlString = modifiedUrlString.substring(4)
} }
// 2. 检查并添加协议前缀 // 2. 处理域名通配符 (*.example.com)
if (!modifiedUrlString.match(/^[a-zA-Z]+:\/\//)) { let domain = modifiedUrlString
modifiedUrlString = 'https://' + modifiedUrlString if (domain.includes('://')) {
const parts = domain.split('://')
const domainPart = parts[1]
if (domainPart.startsWith('*.')) {
domain = parts[0] + '://' + domainPart.substring(2)
} else {
domain = modifiedUrlString
}
} else if (domain.startsWith('*.')) {
domain = domain.substring(2)
} else {
domain = modifiedUrlString
} }
// 3. URL 解析和验证 // 3. 检查并添加协议前缀
const url = new URL(modifiedUrlString) if (!domain.match(/^[a-zA-Z]+:\/\//)) {
domain = 'https://' + domain
}
// 4. URL 解析和验证
const url = new URL(domain)
if (url.protocol !== 'https:') { if (url.protocol !== 'https:') {
if (url.protocol !== 'http:') { if (url.protocol !== 'http:') {
hasError = true hasError = true
@ -31,14 +46,8 @@ export function formatDomains(urls: string[]): FormatDomainsResult {
} }
} }
// 4. 通配符处理
let domain = url.hostname
if (domain.startsWith('*.')) {
domain = domain.substring(2)
}
// 5. 格式化 // 5. 格式化
const formattedDomain = `https://${domain}` const formattedDomain = `https://${url.hostname}`
formattedDomains.push(formattedDomain) formattedDomains.push(formattedDomain)
} catch (error) { } catch (error) {
hasError = true hasError = true
@ -48,3 +57,4 @@ export function formatDomains(urls: string[]): FormatDomainsResult {
return { formattedDomains, hasError } return { formattedDomains, hasError }
} }