From b288b091b2b3d65d03b634a9d53352da205e4361 Mon Sep 17 00:00:00 2001 From: kdletters Date: Sun, 5 Jul 2026 17:56:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=B2=BE=E9=80=89=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E4=B8=8E=E7=B4=A0=E6=9D=90=E6=9F=A5=E8=AF=A2=E5=B1=95?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除素材查询分类筛选和分类列 精选审核通过后改为手动设置展示分类 公开精选按分类展示并补充底部点赞按钮 使用文档大拇指透明图标并同步点赞测试 同步精选审核数据契约、绑定和文档 --- apps/admin-web/src/api/adminApiClient.ts | 2 - apps/admin-web/src/api/adminApiTypes.ts | 4 +- .../pages/AdminEditorAssetQueryPage.test.tsx | 42 ++++++- .../src/pages/AdminEditorAssetQueryPage.tsx | 63 +++-------- .../AdminEditorShowcaseReviewPage.test.tsx | 107 +++++++++++++++++- .../pages/AdminEditorShowcaseReviewPage.tsx | 107 ++++++++++++------ apps/admin-web/src/styles/admin.css | 29 +++-- .../shared-memory/decision-log.md | 2 +- ...架构】图片画布编辑器MVP接入方案-2026-06-11.md | 2 +- ...】server-rs与SpacetimeDB数据契约-2026-05-15.md | 4 +- ...作】创作主页与项目入口改版计划-2026-06-18.md | 8 +- public/creation-home/showcase-like-thumb.png | Bin 0 -> 6996 bytes server-rs/crates/api-server/src/admin.rs | 5 +- .../crates/api-server/src/editor_project.rs | 13 +++ .../crates/shared-contracts/src/admin.rs | 5 +- .../src/mapper/editor_project.rs | 8 +- .../admin_editor_asset_list_input_type.rs | 1 - ...or_showcase_asset_admin_list_input_type.rs | 1 - ...howcase_asset_display_update_input_type.rs | 1 + .../editor_showcase_asset_snapshot_type.rs | 1 + .../editor_showcase_asset_type.rs | 3 + .../src/editor_project_storage.rs | 53 +++++---- .../crates/spacetime-module/src/migration.rs | 8 ++ .../CreationLandingView.test.tsx | 59 ++++++++++ .../creation-home/CreationLandingView.tsx | 96 ++++++++++------ .../creationShowcaseModel.test.ts | 27 +++++ .../creation-home/creationShowcaseModel.ts | 23 ++++ src/index.css | 70 +++++++++++- .../image-editor/editorProjectClient.ts | 2 + 29 files changed, 571 insertions(+), 175 deletions(-) create mode 100644 public/creation-home/showcase-like-thumb.png diff --git a/apps/admin-web/src/api/adminApiClient.ts b/apps/admin-web/src/api/adminApiClient.ts index 665a2aee4..ff5306b42 100644 --- a/apps/admin-web/src/api/adminApiClient.ts +++ b/apps/admin-web/src/api/adminApiClient.ts @@ -599,7 +599,6 @@ function buildEditorAssetListQuery(query: AdminEditorAssetListQuery) { const params = new URLSearchParams(); appendQueryParam(params, 'cursor', query.cursor); appendQueryParam(params, 'ownerUserId', query.ownerUserId); - appendQueryParam(params, 'assetKind', query.assetKind); appendQueryParam(params, 'keyword', query.keyword); appendQueryParam(params, 'createdAfter', query.createdAfter); appendQueryParam(params, 'createdBefore', query.createdBefore); @@ -614,7 +613,6 @@ function buildEditorShowcaseListQuery(query: AdminEditorShowcaseListQuery) { const params = new URLSearchParams(); appendQueryParam(params, 'cursor', query.cursor); appendQueryParam(params, 'ownerUserId', query.ownerUserId); - appendQueryParam(params, 'assetKind', query.assetKind); appendQueryParam(params, 'reviewStatus', query.reviewStatus); appendQueryParam(params, 'submittedAfter', query.submittedAfter); appendQueryParam(params, 'submittedBefore', query.submittedBefore); diff --git a/apps/admin-web/src/api/adminApiTypes.ts b/apps/admin-web/src/api/adminApiTypes.ts index 64068ff0e..f63ac4588 100644 --- a/apps/admin-web/src/api/adminApiTypes.ts +++ b/apps/admin-web/src/api/adminApiTypes.ts @@ -349,7 +349,6 @@ export interface AdminUpdateWorkVisibilityResponse { export interface AdminEditorAssetListQuery { cursor?: string | null; ownerUserId?: string | null; - assetKind?: string | null; keyword?: string | null; createdAfter?: string | null; createdBefore?: string | null; @@ -391,7 +390,6 @@ export interface AdminEditorAssetListResponse { export interface AdminEditorShowcaseListQuery { cursor?: string | null; ownerUserId?: string | null; - assetKind?: string | null; reviewStatus?: string | null; submittedAfter?: string | null; submittedBefore?: string | null; @@ -431,6 +429,7 @@ export interface AdminEditorShowcaseAssetPayload { approvedAt?: string | null; rejectedAt?: string | null; updatedAt: string; + showcaseCategory?: string | null; } export interface AdminEditorShowcaseListResponse { @@ -447,6 +446,7 @@ export interface AdminEditorShowcaseReviewRequest { export interface AdminEditorShowcaseDisplayRequest { showcaseId: string; displayEnabled: boolean; + showcaseCategory?: string | null; } export interface AdminEditorShowcaseAssetResponse { diff --git a/apps/admin-web/src/pages/AdminEditorAssetQueryPage.test.tsx b/apps/admin-web/src/pages/AdminEditorAssetQueryPage.test.tsx index 948251eb6..9c7612f3d 100644 --- a/apps/admin-web/src/pages/AdminEditorAssetQueryPage.test.tsx +++ b/apps/admin-web/src/pages/AdminEditorAssetQueryPage.test.tsx @@ -71,7 +71,7 @@ test('后台素材查询展示作者昵称和陶泥号', async () => { expect(screen.queryByText('user-1')).toBeNull(); }); -test('后台素材查询按用户、分类和时间调用查询接口', async () => { +test('后台素材查询按用户、搜索和时间调用查询接口', async () => { render( { expect(listAdminEditorAssets).toHaveBeenLastCalledWith('admin-token', { ownerUserId: 'user-1', - assetKind: 'character', keyword: '陶泥角色', createdAfter: '2026-07-01T00:00:00+08:00', createdBefore: '2026-07-04T23:59:59.999+08:00', @@ -109,6 +105,19 @@ test('后台素材查询按用户、分类和时间调用查询接口', async () }); }); +test('后台素材查询不展示分类筛选和分类列', async () => { + render( + , + ); + + expect(await screen.findByText('角色形象 1')).toBeTruthy(); + expect(screen.queryByLabelText('分类')).toBeNull(); + expect(screen.queryByRole('columnheader', {name: '分类'})).toBeNull(); +}); + test('后台素材查询缩略图使用 objectKey 换签后展示', async () => { render( }); }); +test('后台素材查询格式化微秒时间文本', async () => { + vi.mocked(listAdminEditorAssets).mockResolvedValueOnce({ + entries: [ + { + ...generatedAsset, + createdAt: '1783231493.573727Z', + updatedAt: '1783231493.573727Z', + }, + ], + nextCursor: null, + }); + + render( + , + ); + + expect(await screen.findByText('角色形象 1')).toBeTruthy(); + expect(screen.queryByText('1783231493.573727Z')).toBeNull(); +}); + test('后台素材查询可查看素材详情', async () => { render( ([]); const [keyword, setKeyword] = useState(''); const [ownerUserId, setOwnerUserId] = useState(''); - const [assetKind, setAssetKind] = useState(''); const [createdAfter, setCreatedAfter] = useState(''); const [createdBefore, setCreatedBefore] = useState(''); const [nextCursor, setNextCursor] = useState(null); @@ -54,7 +43,7 @@ export function AdminEditorAssetQueryPage({ useEffect(() => { void refreshPage(); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [token, ownerUserId, assetKind, keyword, createdAfter, createdBefore]); + }, [token, ownerUserId, keyword, createdAfter, createdBefore]); async function refreshPage() { setIsLoading(true); @@ -93,7 +82,6 @@ export function AdminEditorAssetQueryPage({ function buildListQuery(): AdminEditorAssetListQuery { return { ownerUserId: ownerUserId || null, - assetKind: assetKind || null, keyword: keyword.trim() || null, createdAfter: dateInputToStartRfc3339(createdAfter), createdBefore: dateInputToEndRfc3339(createdBefore), @@ -149,19 +137,6 @@ export function AdminEditorAssetQueryPage({ onChange={(event) => setOwnerUserId(event.target.value)} /> -