素材库(虚拟人像): - 后端:AssetGroup/Asset 模型 + 火山 Assets API 客户端 + 7 个 API 端点 - 前端:素材库管理弹窗(上传/浏览/追加/改名/状态轮询) - PromptInput:@ 搜索素材库 + mention 标签(缩略图+名字) - 提交生成时提取 asset:// 引用并去重 - 打开素材详情时自动检查云端状态,已删除的自动清理 - 后端 reference_snapshots 存储 thumb_url,刷新后标签缩略图和 hover 预览正常 生成页面 UI: - 提示词 hover 即梦风格:原位展开玻璃底覆盖视频,不弹浮层 - 标签(AirDrama/时长/比例)inline 排列,溢出时 canvas 截断 - 详细信息弹窗支持鼠标移上去不消失(延迟关闭),增加 token/费用信息 - 任务卡片/视频详情页提示词标签化(renderPromptWithMentions) - 视频详情页底部去掉重复按钮,信息栏 flex-wrap 自动换行 mention 标签: - 输入框内剪切/复制粘贴保留标签(handlePaste 检测 text/html) - 拖拽标签跟手(caretRangeFromPoint + drop 位置精确插入) - 拖拽时 hover 预览自动关闭,InputBar 蓝边仅外部文件拖入时触发 其他: - 联网搜索按钮(暂禁用,等火山确认 API) - card max-width 800→1024,参考图缩略图 48→56px 居中对齐 - 导航箭头禁用时不触发关闭(去掉 pointer-events:none) - API 错误信息附带原始报错便于排查 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
54 lines
3.0 KiB
Python
54 lines
3.0 KiB
Python
# Generated by Django 4.2.29 on 2026-03-21 09:44
|
|
|
|
from django.conf import settings
|
|
from django.db import migrations, models
|
|
import django.db.models.deletion
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
dependencies = [
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
('accounts', '0010_billing_data_migration'),
|
|
('generation', '0007_billing_system_v010'),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name='AssetGroup',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('remote_group_id', models.CharField(default='', max_length=100, verbose_name='火山Group ID')),
|
|
('name', models.CharField(default='', max_length=100, verbose_name='角色名')),
|
|
('description', models.CharField(blank=True, default='', max_length=300, verbose_name='描述')),
|
|
('thumbnail_url', models.CharField(blank=True, default='', max_length=1000, verbose_name='缩略图URL')),
|
|
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
|
('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_asset_groups', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
|
|
('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='asset_groups', to='accounts.team', verbose_name='所属团队')),
|
|
],
|
|
options={
|
|
'verbose_name': '素材组',
|
|
'verbose_name_plural': '素材组',
|
|
'ordering': ['-created_at'],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='Asset',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('remote_asset_id', models.CharField(default='', max_length=100, verbose_name='火山Asset ID')),
|
|
('name', models.CharField(default='', max_length=100, verbose_name='素材名称')),
|
|
('url', models.CharField(blank=True, default='', max_length=1000, verbose_name='图片URL')),
|
|
('status', models.CharField(choices=[('processing', '处理中'), ('active', '可用'), ('failed', '失败')], default='processing', max_length=20, verbose_name='状态')),
|
|
('error_message', models.CharField(blank=True, default='', max_length=500, verbose_name='错误信息')),
|
|
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
|
('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assets', to='generation.assetgroup', verbose_name='所属素材组')),
|
|
],
|
|
options={
|
|
'verbose_name': '素材',
|
|
'verbose_name_plural': '素材',
|
|
'ordering': ['-created_at'],
|
|
},
|
|
),
|
|
]
|