From b03b6b0c130ef8f67b15a2bc8634fdfedb6ea668 Mon Sep 17 00:00:00 2001 From: kdletters Date: Mon, 22 Jun 2026 19:09:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=95=E5=AF=BC=E7=A7=BB=E5=8A=A8=E7=AB=AF?= =?UTF-8?q?=E5=88=9B=E4=BD=9C=E4=B8=BB=E9=A1=B5=E4=BD=BF=E7=94=A8=E6=A1=8C?= =?UTF-8?q?=E9=9D=A2=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移动端直达 /creation 时展示桌面端打开引导 补充移动端创作主页回归测试 同步创作主页与玩法链路文档口径 --- .../shared-memory/decision-log.md | 2 +- ...作】创作主页与项目入口改版计划-2026-06-18.md | 10 ++-- ...玩法创作】平台入口与玩法链路-2026-05-15.md | 2 + .../PlatformEntryFlowShellImpl.tsx | 51 ++++++++++++++++++- ...gEntryFlowShell.agent.interaction.test.tsx | 22 +++++++- 5 files changed, 78 insertions(+), 9 deletions(-) diff --git a/docs/project-memory/shared-memory/decision-log.md b/docs/project-memory/shared-memory/decision-log.md index 7724126d4..bc7c21bf1 100644 --- a/docs/project-memory/shared-memory/decision-log.md +++ b/docs/project-memory/shared-memory/decision-log.md @@ -67,7 +67,7 @@ ## 2026-06-18 `/creation` 独立为陶泥儿创作工具主页 - 背景:图片画布项目已经成为独立项目资产,旧“创作”站内 Tab 和一级“草稿”入口不能清晰表达桌面端创作工具主页与项目管理入口。 -- 决策:桌面端新增独立 `/creation` 创作工具主页,桌面端直接打开站点首页 `/` 时也默认展示新版创作主页;顶级“创作”入口跳转 `/creation`,原“草稿”入口替换为“项目”并跳转 `/project`。移动端首页 `/` 继续保持原推荐首页,移动端隐藏“创作”和“项目”入口,但不拦截直接 URL。页面文案统一使用“陶泥儿”,外部品牌只作为设计参考,不进入用户可见 UI、测试名、产品文案或验收口径。`陶泥儿精选` 是用户素材瀑布流,不展示玩法入口列表;创作入口事实源继续来自 `/api/creation-entry/config`,项目入口通过 `createEditorProject` 和 `/editor/canvas?projectid=xxx` 链路进入画布。 +- 决策:桌面端新增独立 `/creation` 创作工具主页,桌面端直接打开站点首页 `/` 时也默认展示新版创作主页;顶级“创作”入口跳转 `/creation`,原“草稿”入口替换为“项目”并跳转 `/project`。移动端首页 `/` 继续保持原推荐首页,移动端隐藏“创作”和“项目”入口;移动端直达 `/creation` 时不加载创作主页,显示桌面端打开引导,`/creation/` 玩法工作台直达仍按原链路进入。页面文案统一使用“陶泥儿”,外部品牌只作为设计参考,不进入用户可见 UI、测试名、产品文案或验收口径。`陶泥儿精选` 是用户素材瀑布流,不展示玩法入口列表;创作入口事实源继续来自 `/api/creation-entry/config`,项目入口通过 `createEditorProject` 和 `/editor/canvas?projectid=xxx` 链路进入画布。 - 影响范围:平台入口导航、`SelectionStage` 路由、`/creation` 首页、`/project` 项目入口、`/editor/canvas` 项目打开链路、“我的”页快捷入口和创作入口相关测试。 - 验证方式:桌面 `/` 初始阶段和 `/creation` 解析为创作主页,移动端 `/` 仍是推荐首页,`/creation/` 仍进入对应玩法工作台;桌面导航显示“创作 / 项目”且不显示“草稿”;移动端底部不显示“创作 / 项目”;页面不出现外站品牌或 `Discord` 字样;新建项目进入 `/editor/canvas?projectid=xxx`。 - 关联文档:`docs/【玩法创作】创作主页与项目入口改版计划-2026-06-18.md`、`docs/【玩法创作】平台入口与玩法链路-2026-05-15.md`。 diff --git a/docs/【玩法创作】创作主页与项目入口改版计划-2026-06-18.md b/docs/【玩法创作】创作主页与项目入口改版计划-2026-06-18.md index a8d98456b..363ac3602 100644 --- a/docs/【玩法创作】创作主页与项目入口改版计划-2026-06-18.md +++ b/docs/【玩法创作】创作主页与项目入口改版计划-2026-06-18.md @@ -13,7 +13,7 @@ - 新增桌面端独立 `/creation` 创作工具主页。 - 桌面端直接打开站点首页 `/` 时默认展示新版创作主页内容;移动端继续保持原推荐首页。 - 顶级导航中“创作”进入 `/creation`,“草稿”改为“项目”并进入 `/project`。 -- 移动端隐藏“创作”和“项目”入口,只保留浏览和个人相关入口。 +- 移动端隐藏“创作”和“项目”入口,只保留浏览和个人相关入口;移动端直达 `/creation` 时提示用户使用桌面端打开。 - 登录后在创作主页展示最近项目,并通过新建项目进入 `/editor/canvas?projectid=xxx`。 - `陶泥儿精选` 展示真实账号素材瀑布流,不使用 mock 素材。 - 现有 `/creation/` 玩法工作台、草稿、作品架、生成恢复和发布链路保持不变。 @@ -128,7 +128,7 @@ Tab: - 桌面端从 `/creation` 切换到 `/project` 后,“项目”页签进入选中态,“创作”页签必须恢复为普通默认态,不保留创作主页的主按钮强调表现。 - `/project` 项目页头部必须提供 `返回主站` 按钮,点击后切回平台首页 `/`,行为与桌面侧栏切回推荐页保持一致。 - 移动端导航列表不展示“创作”和“项目”。 -- 移动端不拦截用户直接访问 `/creation` 或 `/project`。 +- 移动端直接访问 `/creation` 时显示桌面端打开引导,不加载创作工具主页;`/creation/` 继续直达对应玩法工作台。`/project` 暂不新增移动端拦截。 ## 实施拆分 @@ -137,7 +137,7 @@ Tab: - 增加 `/creation` 路由映射和测试。 - 增加桌面 `/` 初始阶段映射测试,确认不会影响移动端首页。 - 调整桌面导航文案与点击行为。 -- 移动端导航移除“创作”和“项目”入口。 +- 移动端导航移除“创作”和“项目”入口,并为直达 `/creation` 增加桌面端打开引导。 - 保持现有 `/creation/` 工作台、生成页、结果页和运行态路由不回归。 ### 创作主页 @@ -194,6 +194,7 @@ git diff --check - 桌面导航显示“项目”,不显示“草稿”。 - `/project` 头部点击“返回主站”回到 `/`,并退出项目页主内容。 - 移动视口底部不显示“创作”和“项目”。 +- 移动端直达 `/creation` 显示“请在桌面端打开创作主页”,点击“返回首页”回到 `/`。 - “我的”页没有项目快捷入口。 - 陶泥儿精选素材瀑布流不出现 mock 素材、假作者或假泥点成本。 - 陶泥儿精选素材卡按真实素材宽高呈现瀑布流,不退化为固定等高网格。 @@ -205,4 +206,5 @@ git diff --check - 不删除现有玩法草稿、作品架、生成恢复、发布或运行态能力。 - 不恢复前端硬编码创作入口配置。 - 不用 mock 素材填充用户素材展示。 -- 不在移动端禁止直接 URL 访问 `/creation` 或 `/project`。 +- 不影响 `/creation/` 玩法工作台、生成页、结果页和运行态直达恢复。 +- 不在本轮拦截移动端直接 URL 访问 `/project`。 diff --git a/docs/【玩法创作】平台入口与玩法链路-2026-05-15.md b/docs/【玩法创作】平台入口与玩法链路-2026-05-15.md index 7b01094e4..66c975cff 100644 --- a/docs/【玩法创作】平台入口与玩法链路-2026-05-15.md +++ b/docs/【玩法创作】平台入口与玩法链路-2026-05-15.md @@ -8,6 +8,8 @@ 当前点击底部加号进入的创作入口页承载后台公告位、创作入口页签和两列模板卡;页签中只有真实后端作品架摘要存在时才展示“最近创作”,其余为玩法模板分类。点击模板卡后直接进入对应玩法已有的入口创作表单 stage,不再经过空白占位页,也不把旧表单嵌进创作入口页;模板点击的占位 no-op、隐藏模板拦截、未知入口 no-op 和工作台启动目标统一由 `platformCreationLaunchModel.ts` 判定,壳层只执行启动前准备、错误提示和受保护动作。移动端创作入口页顶栏在 `陶泥儿` 品牌同一行显示真实账户泥点数,数据来自 `profileDashboard.walletBalance`,不得再把公告内容或活动奖池当作账号余额展示。创作入口页公告位数据优先读取 `GET /api/creation-entry/config` 的 `eventBanners` 数组,多条配置时前端自动轮播;旧 `eventBanner` 只保留字段回显与旧客户端兼容,不再作为前端公告数组的兜底来源。后台公告配置面向表单:每条公告包含标题和 HTML 内容,后台保存时序列化为后端 `eventBannersJson` 传输字段,由前端空权限沙箱 iframe 展示;旧结构化 banner 字段仅保留回显兼容,不再作为后台公告配置主格式;不得执行 JSX 或把后台代码直接注入 DOM。玩法列表不再套外部边框卡片,移动端需要压缩横向边距和两列间距;玩法卡统一按“上图、左上状态标签(仅非开放态显示)、封面右下显示 `creationTypes[].unifiedCreationSpec.mudPointCost` 经前端格式化后的泥点消耗、下方白底标题/描述”结构展示,旧契约缺少该字段时兜底 `10` 并由前端显示为 `10泥点数`,卡片高度保持紧凑但标题、描述和预估消耗点数都必须可见。创作入口页根容器不再使用 `platform-page-stage` 这类全局内容卡片壳,但继续保留 `platform-remap-surface` 作为主题和输入框样式命中钩子。创作入口页字号需要对齐平台普通 UI 档位:顶栏泥点组件、公告正文、分类 Tab 和玩法卡标题 / 副标题 / 消耗说明优先使用 `11px` 到 `14px`,不使用 `text-lg`、`text-xl` 或更大的展示级字号。草稿 Tab 继续承接作品架;底部加号入口页的“最近创作”只用 7 天内的真实后端作品架摘要判断是否展示,并从摘要里推导最近使用过的模板 ID,页面必须展示“仅显示最近7天内使用过的模板”提示,列表内容必须复用其它页签里的模板卡样式、文案和点击行为,不展示具体作品名称、摘要或生成状态,也不新增独立最近创作卡组件。RPG、RPG 之外的各玩法入口分别落到既有的 `agent-workspace`、`big-fish-agent-workspace`、`match3d-agent-workspace`、`square-hole-agent-workspace`、`jump-hop-workspace`、`wooden-fish-workspace`、`puzzle-agent-workspace`、`bark-battle-workspace`、`visual-novel-agent-workspace`、`baby-object-match-workspace`,这些入口继续承接各玩法自己的表单、草稿恢复和后续编排,不作为创作入口页内容。 +`/creation` 是桌面端创作工具主页;移动端直达 `/creation` 时只显示桌面端打开引导,不加载桌面创作主页和项目 / 素材数据。`/creation/` 仍按各玩法路由直达对应工作台、生成页或结果页,不受该引导影响。 + 旧库或旧迁移包没有 `event_banners_json` 时,后端读取层必须把 `eventBanners` 归一到 `module-runtime` 默认公告数组,不能把旧结构化 `eventBanner` 当成前端优先数组下发。默认公告引用的背景图必须指向 `public/` 下真实存在的站内静态资源,当前默认使用 `/creation-type-references/puzzle.webp`,避免创作入口顶部 banner 出现失效图片。 创作页和草稿页顶栏右上角的泥点余额胶囊是补足泥点入口:如果当前运行环境开启充值入口,点击后直接打开账户充值弹窗;否则直接打开运营兑换码弹窗。该入口不再跳到账户面板或泥点账单,头像 / 设置等账号入口继续保留各自语义。 diff --git a/src/components/platform-entry/PlatformEntryFlowShellImpl.tsx b/src/components/platform-entry/PlatformEntryFlowShellImpl.tsx index d060c9c6e..b62f82cb3 100644 --- a/src/components/platform-entry/PlatformEntryFlowShellImpl.tsx +++ b/src/components/platform-entry/PlatformEntryFlowShellImpl.tsx @@ -1,4 +1,4 @@ -import { Loader2 } from 'lucide-react'; +import { Home, Loader2, Monitor } from 'lucide-react'; import { AnimatePresence, motion } from 'motion/react'; import { @@ -1636,6 +1636,45 @@ function CreationResultRecoveryPanel({ ); } +function MobileCreationDesktopGuide({ + onReturnHome, +}: { + onReturnHome: () => void; +}) { + return ( +
+ + + +

+ 请在桌面端打开创作主页 +

+

+ 图片画布、项目管理和素材库需要更大的操作空间。 +

+ + +
+
+ ); +} + export function PlatformEntryFlowShellImpl({ selectionStage, setSelectionStage, @@ -15238,7 +15277,7 @@ export function PlatformEntryFlowShellImpl({ 'works-only', '正在加载草稿列表...', ); - const creationLandingContent = ( + const creationLandingContent = isDesktopLayout ? ( }> + ) : ( + { + pushAppHistoryPath('/'); + platformBootstrap.setPlatformTab('home'); + setSelectionStage('platform', { path: '/' }); + }} + /> ); const projectGalleryContent = ( }> diff --git a/src/components/rpg-entry/RpgEntryFlowShell.agent.interaction.test.tsx b/src/components/rpg-entry/RpgEntryFlowShell.agent.interaction.test.tsx index d2153e61a..c0dce9ae1 100644 --- a/src/components/rpg-entry/RpgEntryFlowShell.agent.interaction.test.tsx +++ b/src/components/rpg-entry/RpgEntryFlowShell.agent.interaction.test.tsx @@ -9267,13 +9267,22 @@ test('project page header can return to main site', async () => { expect(window.location.pathname).toBe('/'); }); -test('direct mobile creation home keeps landing content without mobile nav entry', async () => { +test('direct mobile creation home guides users to desktop without mobile nav entry', async () => { + const user = userEvent.setup(); window.history.replaceState(null, '', '/creation'); const { container } = render(); expect( - await screen.findByRole('main', { name: '陶泥儿创作主页' }), + await screen.findByRole('main', { name: '桌面端创作提示' }), ).toBeTruthy(); + expect(screen.getByText('请在桌面端打开创作主页')).toBeTruthy(); + expect( + screen.getByText('图片画布、项目管理和素材库需要更大的操作空间。'), + ).toBeTruthy(); + expect( + screen.queryByRole('main', { name: '陶泥儿创作主页' }), + ).toBeNull(); + const bottomNav = container.querySelector('.platform-bottom-nav'); expect(bottomNav).toBeTruthy(); expect( @@ -9282,6 +9291,15 @@ test('direct mobile creation home keeps landing content without mobile nav entry expect( within(bottomNav as HTMLElement).queryByRole('button', { name: '项目' }), ).toBeNull(); + + await user.click(screen.getByRole('button', { name: /返回首页/u })); + + await waitFor(() => { + expect(window.location.pathname).toBe('/'); + expect( + screen.queryByRole('main', { name: '桌面端创作提示' }), + ).toBeNull(); + }); }); test('embedded puzzle form timeout exits busy state and shows a readable error', async () => {