diff --git a/web/src/pages/Channel/EditChannel.js b/web/src/pages/Channel/EditChannel.js
index ff66d65f..0934d891 100644
--- a/web/src/pages/Channel/EditChannel.js
+++ b/web/src/pages/Channel/EditChannel.js
@@ -26,6 +26,7 @@ import {
Form,
Row,
Col,
+ Highlight,
} from '@douyinfe/semi-ui';
import { getChannelModels, copy, getChannelIcon, getModelCategories } from '../../helpers';
import {
@@ -122,6 +123,8 @@ const EditChannel = (props) => {
const [vertexFileList, setVertexFileList] = useState([]);
const vertexErroredNames = useRef(new Set()); // 避免重复报错
const [isMultiKeyChannel, setIsMultiKeyChannel] = useState(false);
+ const [channelSearchValue, setChannelSearchValue] = useState('');
+ const [useManualInput, setUseManualInput] = useState(false); // 是否使用手动输入模式
const getInitValues = () => ({ ...originInputs });
const handleInputChange = (name, value) => {
if (formApiRef.current) {
@@ -190,6 +193,9 @@ const EditChannel = (props) => {
setInputs((inputs) => ({ ...inputs, models: localModels }));
}
setBasicModels(localModels);
+
+ // 重置手动输入模式状态
+ setUseManualInput(false);
}
//setAutoBan
};
@@ -418,6 +424,8 @@ const EditChannel = (props) => {
} else {
formApiRef.current?.setValues(getInitValues());
}
+ // 重置手动输入模式状态
+ setUseManualInput(false);
} else {
formApiRef.current?.reset();
}
@@ -468,41 +476,60 @@ const EditChannel = (props) => {
let localInputs = { ...formValues };
if (localInputs.type === 41) {
- let keys = vertexKeys;
-
- // 若当前未选择文件,尝试从已上传文件列表解析(异步读取)
- if (keys.length === 0 && vertexFileList.length > 0) {
- try {
- const parsed = await Promise.all(
- vertexFileList.map(async (item) => {
- const fileObj = item.fileInstance;
- if (!fileObj) return null;
- const txt = await fileObj.text();
- return JSON.parse(txt);
- })
- );
- keys = parsed.filter(Boolean);
- } catch (err) {
- showError(t('解析密钥文件失败: {{msg}}', { msg: err.message }));
+ if (useManualInput) {
+ // 手动输入模式
+ if (localInputs.key && localInputs.key.trim() !== '') {
+ try {
+ // 验证 JSON 格式
+ const parsedKey = JSON.parse(localInputs.key);
+ // 确保是有效的密钥格式
+ localInputs.key = JSON.stringify(parsedKey);
+ } catch (err) {
+ showError(t('密钥格式无效,请输入有效的 JSON 格式密钥'));
+ return;
+ }
+ } else if (!isEdit) {
+ showInfo(t('请输入密钥!'));
return;
}
- }
-
- // 创建模式必须上传密钥;编辑模式可选
- if (keys.length === 0) {
- if (!isEdit) {
- showInfo(t('请上传密钥文件!'));
- return;
- } else {
- // 编辑模式且未上传新密钥,不修改 key
- delete localInputs.key;
- }
} else {
- // 有新密钥,则覆盖
- if (batch) {
- localInputs.key = JSON.stringify(keys);
+ // 文件上传模式
+ let keys = vertexKeys;
+
+ // 若当前未选择文件,尝试从已上传文件列表解析(异步读取)
+ if (keys.length === 0 && vertexFileList.length > 0) {
+ try {
+ const parsed = await Promise.all(
+ vertexFileList.map(async (item) => {
+ const fileObj = item.fileInstance;
+ if (!fileObj) return null;
+ const txt = await fileObj.text();
+ return JSON.parse(txt);
+ })
+ );
+ keys = parsed.filter(Boolean);
+ } catch (err) {
+ showError(t('解析密钥文件失败: {{msg}}', { msg: err.message }));
+ return;
+ }
+ }
+
+ // 创建模式必须上传密钥;编辑模式可选
+ if (keys.length === 0) {
+ if (!isEdit) {
+ showInfo(t('请上传密钥文件!'));
+ return;
+ } else {
+ // 编辑模式且未上传新密钥,不修改 key
+ delete localInputs.key;
+ }
} else {
- localInputs.key = JSON.stringify(keys[0]);
+ // 有新密钥,则覆盖
+ if (batch) {
+ localInputs.key = JSON.stringify(keys);
+ } else {
+ localInputs.key = JSON.stringify(keys[0]);
+ }
}
}
}
@@ -646,23 +673,33 @@ const EditChannel = (props) => {
if (!checked) {
setMultiToSingle(false);
setMultiKeyMode('random');
+ } else {
+ // 批量模式下禁用手动输入,并清空手动输入的内容
+ setUseManualInput(false);
+ if (inputs.type === 41) {
+ // 清空手动输入的密钥内容
+ if (formApiRef.current) {
+ formApiRef.current.setValue('key', '');
+ }
+ handleInputChange('key', '');
+ }
}
}}
>{t('批量创建')}
- {batch && (
-