修复前端页面问题

This commit is contained in:
hjjjj 2026-01-26 16:45:55 +08:00
parent 1f10bb4406
commit 482fd2d292

View File

@ -302,16 +302,6 @@ export const ProjectCreateEnhanced = () => {
return false // 阻止自动上传 return false // 阻止自动上传
} }
// 选择"从头创作"模式
const handleSelectCreateMode = () => {
setCreationMode('create')
setUploadedScript('')
// 重置子模式
setCreateSubMode(null)
setDirectTextInput('')
setInspirationFile(null)
}
// 选择从头创作的子模式 // 选择从头创作的子模式
const handleSelectCreateSubMode = (mode: 'text' | 'file') => { const handleSelectCreateSubMode = (mode: 'text' | 'file') => {
setCreateSubMode(mode) setCreateSubMode(mode)
@ -323,7 +313,7 @@ export const ProjectCreateEnhanced = () => {
} }
} }
// 清除创作方式选择 // 清除创作方式选择(取消所有选择)
const handleClearCreationMode = () => { const handleClearCreationMode = () => {
setCreationMode(null) setCreationMode(null)
setCreateSubMode(null) setCreateSubMode(null)
@ -934,266 +924,287 @@ export const ProjectCreateEnhanced = () => {
{/* 创作方式选择 */} {/* 创作方式选择 */}
<Card title="选择创作方式" extra={<SettingOutlined />}> <Card title="选择创作方式" extra={<SettingOutlined />}>
<Space direction="vertical" size="middle" style={{ width: '100%' }}> <Radio.Group
{/* 上传剧本选项 */} value={creationMode}
<Card onChange={(e) => {
size="small" const mode = e.target.value
title="上传剧本" setCreationMode(mode)
style={{ // 切换模式时清空相关状态
cursor: 'pointer', if (mode === 'upload') {
border: creationMode === 'upload' ? '2px solid #1677ff' : undefined, setCreateSubMode(null)
backgroundColor: creationMode === 'upload' ? '#f0f5ff' : undefined setDirectTextInput('')
}} setInspirationFile(null)
onClick={() => setCreationMode('upload')} } else if (mode === 'create') {
> setUploadedScript('')
<div onClick={(e) => e.stopPropagation()}>
<Upload.Dragger
name="script"
multiple={false}
accept=".txt,.md,.docx"
showUploadList={false}
beforeUpload={handleUpload}
style={{ padding: '20px' }}
>
<p className="ant-upload-drag-icon">
<UploadOutlined style={{ fontSize: '32px', color: '#1677ff' }} />
</p>
<p className="ant-upload-text"></p>
<p className="ant-upload-hint"> .txt, .md, .docx </p>
</Upload.Dragger>
{uploadedScript && (
<div style={{ marginTop: '12px' }}>
<Tag color="success" icon={<CheckCircleOutlined />}>
({uploadedScript.length} )
</Tag>
<Button
type="link"
size="small"
onClick={(e) => {
e.stopPropagation()
handleClearCreationMode()
}}
style={{ marginLeft: '8px' }}
>
</Button>
</div>
)}
</div>
{/* 剧本内容预览 */}
{uploadedScript && (
<div style={{ marginTop: '16px' }}>
<Divider style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<span></span>
{uploadedScript.length > 500 && (
<Button
type="link"
size="small"
onClick={(e) => {
e.stopPropagation()
setScriptExpanded(!scriptExpanded)
}}
style={{ padding: 0, height: 'auto' }}
>
{scriptExpanded ? '收起' : '展开全部'}
</Button>
)}
</Divider>
<div
style={{
maxHeight: scriptExpanded ? '60vh' : '150px',
overflowY: 'auto',
background: '#f5f5f5',
padding: '12px',
borderRadius: '4px',
fontSize: '12px',
whiteSpace: 'pre-wrap',
wordBreak: 'break-word',
border: '1px solid #d9d9d9',
lineHeight: '1.6'
}}
>
{uploadedScript}
</div>
{!scriptExpanded && uploadedScript.length > 500 && (
<div style={{ marginTop: '8px', textAlign: 'center' }}>
<Button
type="link"
size="small"
onClick={(e) => {
e.stopPropagation()
setScriptExpanded(true)
}}
>
({uploadedScript.length} )
</Button>
</div>
)}
</div>
)}
</Card>
{/* 从头创作选项 */}
<Card
size="small"
title={
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
<span></span>
{creationMode !== 'create' && (
<Button type="primary" size="small" onClick={handleSelectCreateMode}>
</Button>
)}
{creationMode === 'create' && (
<Button size="small" onClick={handleClearCreationMode}>
</Button>
)}
</div>
} }
style={{ }}
border: creationMode === 'create' ? '2px solid #1677ff' : undefined, style={{ width: '100%' }}
backgroundColor: creationMode === 'create' ? '#f0f5ff' : undefined >
}} <Space direction="vertical" style={{ width: '100%' }} size="middle">
> {/* 上传剧本选项 */}
<Space direction="vertical" style={{ width: '100%' }} size="middle"> <Radio value="upload">
<p style={{ margin: 0, color: '#666' }}> <Card
AI size="small"
</p> style={{
width: '100%',
{creationMode === 'create' && ( border: creationMode === 'upload' ? '2px solid #1677ff' : '1px solid #d9d9d9',
<> backgroundColor: creationMode === 'upload' ? '#f0f5ff' : undefined
<Divider style={{ margin: '12px 0' }} /> }}
>
{/* 子模式选择 */} <Space direction="vertical" style={{ width: '100%' }}>
<div> <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>
<div style={{ marginBottom: '8px', fontSize: '14px', fontWeight: 500 }}> <UploadOutlined style={{ fontSize: '20px', color: '#1677ff' }} />
<span style={{ fontWeight: 500 }}></span>
</div>
<Radio.Group
value={createSubMode}
onChange={(e) => handleSelectCreateSubMode(e.target.value)}
style={{ width: '100%' }}
>
<Space direction="vertical" style={{ width: '100%' }}>
<Radio value="text">
<Space>
<EditOutlined />
<span></span>
</Space>
</Radio>
<Radio value="file">
<Space>
<UploadOutlined />
<span></span>
</Space>
</Radio>
</Space>
</Radio.Group>
</div> </div>
<p style={{ margin: '8px 0', color: '#666' }}>
AI
</p>
{/* 直接输入文字 */} {creationMode === 'upload' && (
{createSubMode === 'text' && ( <>
<div style={{ marginTop: '12px' }}> <Upload.Dragger
<TextArea name="script"
value={directTextInput} multiple={false}
onChange={(e) => setDirectTextInput(e.target.value)} accept=".txt,.md,.docx"
placeholder="请输入您的创作文字、故事大纲、角色设定等内容..." showUploadList={false}
rows={6} beforeUpload={handleUpload}
maxLength={10000} style={{ padding: '20px' }}
showCount
/>
{directTextInput && (
<div style={{ marginTop: '8px' }}>
<Tag color="success" icon={<CheckCircleOutlined />}>
{directTextInput.length}
</Tag>
</div>
)}
</div>
)}
{/* 上传灵感文件 */}
{createSubMode === 'file' && (
<div style={{ marginTop: '12px' }}>
<div style={{ marginBottom: '8px' }}>
<span style={{ fontSize: '14px', fontWeight: 500 }}></span>
<Select
value={inspirationFileType}
onChange={setInspirationFileType}
style={{ width: '200px', marginLeft: '8px' }}
>
<Select.Option value="story"></Select.Option>
<Select.Option value="character"></Select.Option>
<Select.Option value="scene"></Select.Option>
<Select.Option value="dialogue"></Select.Option>
</Select>
</div>
<Upload
accept=".txt,.md,.doc,.docx"
maxCount={1}
fileList={inspirationFile ? [inspirationFile] : []}
beforeUpload={handleInspirationUpload}
onRemove={() => setInspirationFile(null)}
> >
<Button icon={<UploadOutlined />} disabled={inspirationFile !== null}> <p className="ant-upload-drag-icon">
{inspirationFile ? '已选择文件' : '选择文件(支持 .txt, .md, .doc, .docx'} <UploadOutlined style={{ fontSize: '32px', color: '#1677ff' }} />
</Button> </p>
</Upload> <p className="ant-upload-text"></p>
{inspirationFile && ( <p className="ant-upload-hint"> .txt, .md, .docx </p>
<div style={{ marginTop: '8px', fontSize: '12px', color: '#52c41a' }}> </Upload.Dragger>
: {inspirationFile.name}
{uploadedScript && (
<div style={{ marginTop: '12px' }}>
<Tag color="success" icon={<CheckCircleOutlined />}>
({uploadedScript.length} )
</Tag>
<Button
type="link"
size="small"
onClick={(e) => {
e.stopPropagation()
setUploadedScript('')
}}
style={{ marginLeft: '8px' }}
>
</Button>
</div> </div>
)} )}
</div>
)}
{createSubMode && ( {/* 剧本内容预览 */}
<Tag color="blue"> {uploadedScript && (
{createSubMode === 'text' && '已选择:直接输入'} <>
{createSubMode === 'file' && '已选择:文件上传'} <Divider style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
</Tag> <span></span>
{uploadedScript.length > 500 && (
<Button
type="link"
size="small"
onClick={(e) => {
e.stopPropagation()
setScriptExpanded(!scriptExpanded)
}}
style={{ padding: 0, height: 'auto' }}
>
{scriptExpanded ? '收起' : '展开全部'}
</Button>
)}
</Divider>
<div
style={{
maxHeight: scriptExpanded ? '60vh' : '150px',
overflowY: 'auto',
background: '#f5f5f5',
padding: '12px',
borderRadius: '4px',
fontSize: '12px',
whiteSpace: 'pre-wrap',
wordBreak: 'break-word',
border: '1px solid #d9d9d9',
lineHeight: '1.6'
}}
>
{uploadedScript}
</div>
{!scriptExpanded && uploadedScript.length > 500 && (
<div style={{ marginTop: '8px', textAlign: 'center' }}>
<Button
type="link"
size="small"
onClick={(e) => {
e.stopPropagation()
setScriptExpanded(true)
}}
>
({uploadedScript.length} )
</Button>
</div>
)}
</>
)}
</>
)} )}
</> </Space>
)} </Card>
</Space> </Radio>
</Card>
{/* 已选择提示 */} {/* 从头创作选项 */}
{creationMode && ( <Radio value="create">
<Alert <Card
message={ size="small"
creationMode === 'upload' style={{
? '已选择:上传剧本模式' width: '100%',
: creationMode === 'create' && createSubMode === 'text' border: creationMode === 'create' ? '2px solid #1677ff' : '1px solid #d9d9d9',
? '已选择:从头创作 - 直接输入文字' backgroundColor: creationMode === 'create' ? '#f0f5ff' : undefined
: creationMode === 'create' && createSubMode === 'file' }}
? '已选择:从头创作 - 上传灵感文件' >
: '已选择:从头创作模式' <Space direction="vertical" style={{ width: '100%' }}>
} <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>
description={ <EditOutlined style={{ fontSize: '20px', color: '#1677ff' }} />
creationMode === 'upload' && uploadedScript <span style={{ fontWeight: 500 }}></span>
? `已上传剧本 (${uploadedScript.length} 字符)` </div>
: creationMode === 'create' && createSubMode === 'text' && directTextInput <p style={{ margin: '8px 0', color: '#666' }}>
? `已输入 ${directTextInput.length} 个字符` AI
: creationMode === 'create' && createSubMode === 'file' && inspirationFile </p>
? `已上传文件: ${inspirationFile.name}`
: creationMode === 'create' && !createSubMode {creationMode === 'create' && (
? '请选择输入方式' <>
: undefined <Divider style={{ margin: '12px 0' }} />
}
type="success" {/* 子模式选择 */}
showIcon <div>
action={ <div style={{ marginBottom: '8px', fontSize: '14px', fontWeight: 500 }}>
<Button size="small" type="link" onClick={handleClearCreationMode}>
</div>
</Button> <Radio.Group
} value={createSubMode}
/> onChange={(e) => handleSelectCreateSubMode(e.target.value)}
)} style={{ width: '100%' }}
</Space> >
<Space direction="vertical" style={{ width: '100%' }}>
<Radio value="text">
<Space>
<EditOutlined />
<span></span>
</Space>
</Radio>
<Radio value="file">
<Space>
<UploadOutlined />
<span></span>
</Space>
</Radio>
</Space>
</Radio.Group>
</div>
{/* 直接输入文字 */}
{createSubMode === 'text' && (
<div style={{ marginTop: '12px' }}>
<TextArea
value={directTextInput}
onChange={(e) => setDirectTextInput(e.target.value)}
placeholder="请输入您的创作文字、故事大纲、角色设定等内容..."
rows={6}
maxLength={10000}
showCount
/>
{directTextInput && (
<div style={{ marginTop: '8px' }}>
<Tag color="success" icon={<CheckCircleOutlined />}>
{directTextInput.length}
</Tag>
</div>
)}
</div>
)}
{/* 上传灵感文件 */}
{createSubMode === 'file' && (
<div style={{ marginTop: '12px' }}>
<div style={{ marginBottom: '8px' }}>
<span style={{ fontSize: '14px', fontWeight: 500 }}></span>
<Select
value={inspirationFileType}
onChange={setInspirationFileType}
style={{ width: '200px', marginLeft: '8px' }}
>
<Select.Option value="story"></Select.Option>
<Select.Option value="character"></Select.Option>
<Select.Option value="scene"></Select.Option>
<Select.Option value="dialogue"></Select.Option>
</Select>
</div>
<Upload
accept=".txt,.md,.doc,.docx"
maxCount={1}
fileList={inspirationFile ? [inspirationFile] : []}
beforeUpload={handleInspirationUpload}
onRemove={() => setInspirationFile(null)}
>
<Button icon={<UploadOutlined />} disabled={inspirationFile !== null}>
{inspirationFile ? '已选择文件' : '选择文件(支持 .txt, .md, .doc, .docx'}
</Button>
</Upload>
{inspirationFile && (
<div style={{ marginTop: '8px', fontSize: '12px', color: '#52c41a' }}>
: {inspirationFile.name}
</div>
)}
</div>
)}
{createSubMode && (
<Tag color="blue">
{createSubMode === 'text' && '已选择:直接输入'}
{createSubMode === 'file' && '已选择:文件上传'}
</Tag>
)}
</>
)}
</Space>
</Card>
</Radio>
</Space>
</Radio.Group>
{/* 已选择提示 */}
{creationMode && (
<Alert
message={
creationMode === 'upload'
? '已选择:上传剧本模式'
: creationMode === 'create' && createSubMode === 'text'
? '已选择:从头创作 - 直接输入文字'
: creationMode === 'create' && createSubMode === 'file'
? '已选择:从头创作 - 上传灵感文件'
: '已选择:从头创作模式'
}
description={
creationMode === 'upload' && uploadedScript
? `已上传剧本 (${uploadedScript.length} 字符)`
: creationMode === 'create' && createSubMode === 'text' && directTextInput
? `已输入 ${directTextInput.length} 个字符`
: creationMode === 'create' && createSubMode === 'file' && inspirationFile
? `已上传文件: ${inspirationFile.name}`
: creationMode === 'create' && !createSubMode
? '请选择输入方式'
: undefined
}
type="success"
showIcon
action={
<Button size="small" type="link" onClick={handleClearCreationMode}>
</Button>
}
/>
)}
</Card> </Card>
{/* 快捷操作:选择创作方式后显示 */} {/* 快捷操作:选择创作方式后显示 */}