隐藏图片信息中的上游标识

图片信息弹窗标题固定为图片信息,不再拼接图片名称
图片信息弹窗移除 Provider 展示行
Task 展示收口为任务标识末尾数字,避免暴露 Provider 字符串
补充图片信息脱敏展示回归测试
更新画板角色形象生成文档中的图片信息展示口径
This commit is contained in:
2026-06-17 17:46:13 +08:00
parent d8bd371c69
commit d1cd300695
3 changed files with 23 additions and 9 deletions

View File

@@ -57,6 +57,13 @@
- 提交生成规范时,若存在参考图,前端必须把参考图作为 `referenceImageSrcs[0]` 提交到 `/api/editor/images/generations`,并在生图提示词开头自动追加“参考图生成规范”语义:要求模型参考图 1 的构图、风格、材质、色彩、形状语言和视觉层级生成规范图,但不要复制参考图中的文字、水印或无关背景。
- 生成结果的信息快照必须记录该参考图,标题为 `参考图`,便于后续在图片信息面板回看生成输入。
## 图片信息展示
- 图片信息弹窗标题固定为 `图片信息`,不拼接图片 / 图层名称。
- 图片信息弹窗不展示 Provider 行,也不在 Task 中暴露 Provider 字符串。
- Task 只展示任务标识里的数字部分;若任务标识没有数字,则显示 `-`
- 图片 / 图层名称只用于画布内部选择、图层列表和素材管理,不进入图片信息弹窗。
## 可访问性与状态
- 点选状态下画布显示状态提示 `请选择画布中的图片作为角色形象规范,按 Esc 退出`

View File

@@ -31,7 +31,7 @@ describe('ImageCanvasMetadataModalView', () => {
layer={createLayer({
model: 'gpt-image-2',
provider: 'VectorEngine',
taskId: 'task-123',
taskId: 'gpt-image-2-task-123',
objectKey: 'generated/object.png',
generationInputs: {
fields: [{ title: '生成提示词', value: '清爽游戏按钮' }],
@@ -48,8 +48,9 @@ describe('ImageCanvasMetadataModalView', () => {
/>,
);
const dialog = screen.getByRole('dialog', { name: '生成主图图片信息' });
const dialog = screen.getByRole('dialog', { name: '图片信息' });
expect(within(dialog).queryByText('生成主图')).toBeNull();
expect(within(dialog).getByText('生成图片')).toBeTruthy();
expect(within(dialog).getByText('生成提示词')).toBeTruthy();
expect(within(dialog).getByText('清爽游戏按钮')).toBeTruthy();
@@ -57,8 +58,10 @@ describe('ImageCanvasMetadataModalView', () => {
expect(within(dialog).getByText('角色立绘')).toBeTruthy();
expect(within(dialog).getByText('gpt-image-2')).toBeTruthy();
expect(within(dialog).getByText('1024 x 768 px')).toBeTruthy();
expect(within(dialog).getByText('VectorEngine')).toBeTruthy();
expect(within(dialog).getByText('task-123')).toBeTruthy();
expect(within(dialog).queryByText('Provider')).toBeNull();
expect(within(dialog).queryByText(/VectorEngine/u)).toBeNull();
expect(within(dialog).queryByText(/task-/u)).toBeNull();
expect(within(dialog).getByText('123')).toBeTruthy();
expect(within(dialog).getByText('generated/object.png')).toBeTruthy();
});
@@ -80,8 +83,9 @@ describe('ImageCanvasMetadataModalView', () => {
/>,
);
const dialog = screen.getByRole('dialog', { name: '上传素材图片信息' });
const dialog = screen.getByRole('dialog', { name: '图片信息' });
expect(within(dialog).queryByText('上传素材')).toBeNull();
expect(within(dialog).getByText('上传图片')).toBeTruthy();
expect(within(dialog).getAllByText('-').length).toBeGreaterThanOrEqual(3);
expect(within(dialog).getByText('asset-object-1')).toBeTruthy();

View File

@@ -7,6 +7,11 @@ export type ImageCanvasMetadataModalViewProps = {
onClose: () => void;
};
function formatTaskIdForDisplay(taskId?: string | null) {
const numericParts = taskId?.match(/\d+/gu);
return numericParts?.length ? numericParts[numericParts.length - 1] : '-';
}
export function ImageCanvasMetadataModalView({
layer,
onClose,
@@ -14,7 +19,7 @@ export function ImageCanvasMetadataModalView({
return (
<UnifiedModal
open={Boolean(layer)}
title={layer ? `${layer.title}图片信息` : '图片信息'}
title="图片信息"
size="sm"
closeLabel="关闭图片信息"
onClose={onClose}
@@ -70,10 +75,8 @@ export function ImageCanvasMetadataModalView({
<dd>
{layer.originalWidth} x {layer.originalHeight} px
</dd>
<dt>Provider</dt>
<dd>{layer.provider ?? '-'}</dd>
<dt>Task</dt>
<dd>{layer.taskId ?? '-'}</dd>
<dd>{formatTaskIdForDisplay(layer.taskId)}</dd>
<dt>Object</dt>
<dd>{layer.objectKey ?? layer.assetObjectId ?? '-'}</dd>
</dl>