Skip to content

Commit b9908ca

Browse files
committed
Add product design for project type
1 parent a233d8a commit b9908ca

File tree

1 file changed

+213
-0
lines changed

1 file changed

+213
-0
lines changed

docs/product/project-type.zh.md

Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
# 项目类型 Project Type
2+
3+
## 背景
4+
5+
XBuilder 正在从支持单一类型 Project 的创作平台,扩展为支持多种 Project Type 的创作平台。本次设计的核心是明确 Project Type 如何作为产品的基础概念,贯穿创建、浏览、编辑、导入导出和教程等关键场景。
6+
7+
## 目标
8+
9+
* 为 Project 引入显式的 Project Type,作为基础信息的一部分。
10+
* 在项目列表、搜索、探索、详情页、编辑器等关键场景中体现 Project Type。
11+
* 为后续扩展更多 Project Type 预留稳定的信息结构与产品组织方式。
12+
* 兼容存量项目与历史导入导出文件,不要求用户手动迁移。
13+
14+
## 非目标
15+
16+
* 不展开不同类型编辑器内部的具体功能设计。
17+
* 不展开计费或额度管理方案。
18+
* 不定义各类型的长期运营或推荐策略。
19+
20+
## 基本概念与规则
21+
22+
本部分只关注与具体 UI 形态无关的业务概念、信息关系和产品规则。
23+
24+
### Project
25+
26+
Project 是 XBuilder 中最基本的创作与管理单元。用户围绕 Project 进行创建、编辑、保存、发布、搜索、探索、分享、Remix、导入导出等操作。
27+
28+
一个 Project 至少包含两部分信息:
29+
30+
* 基础信息:如 Owner、Name、Type、可见性、创建时间、更新时间等。
31+
* 内容:不同类型对应的具体内容结构,如游戏内容、漫画内容、机器人应用内容等。
32+
33+
### Project Type
34+
35+
Project Type 是 Project 的顶层分类,表达该 Project 属于哪一种创作类别。
36+
37+
Project Type 直接影响:
38+
39+
* 创建入口与默认模板
40+
* 编辑器或编辑器模式的选择
41+
* 运行时或预览方式的选择
42+
* 创作、浏览和编辑入口的组织方式
43+
* 导入导出文件如何恢复为正确的 Project
44+
45+
Project Type 不是展示标签,而是 Project 基础身份的一部分。
46+
47+
### 已确定与示意性的 Project Type
48+
49+
当前阶段已确定的 Project Type 为 `game`,对应已有的 spx 项目。
50+
51+
为说明多类型机制,本文引入两个示意类型:`comic``robot-app`。它们仅用于讨论信息结构、页面组织和用户路径,不代表已确定的落地方向。
52+
53+
三个类型说明如下:
54+
55+
* `game`:已确定类型,文案为"游戏/Game"。对应 Builder 已较成熟的游戏创作能力,也是历史项目的默认兼容类型。
56+
* `comic`:示意类型,文案为"漫画/Comic"。以漫画、分镜、视觉叙事为核心的创作类别。
57+
* `robot-app`:示意类型,文案为"机器人应用/Robot App"。面向机器人或实体设备交互的应用类别。
58+
59+
### Project 标识规则
60+
61+
Project 由 Owner 与 Name 共同标识。Project Type 是基础属性之一,但不改变 Name 的唯一性规则。
62+
63+
规则如下:
64+
65+
* 同一 Owner 下,Project Name 跨类型全局唯一。即不允许同一用户同时拥有同名的不同类型项目(例如 `alice/hello``game` 项目和 `alice/hello` 的其他类型项目不能共存)。
66+
* Project Type 创建后不可变更。
67+
68+
### 账号与全局状态
69+
70+
不按 Project Type 拆分账号体系。用户使用同一账号进入 XBuilder,在同一账号下管理所有类型的 Project。
71+
72+
具体而言:
73+
74+
* 用户身份全局统一,不按 Project Type 分设账号。
75+
* 个人主页、个人资料、关注关系、Like 等行为跨类型统一。
76+
77+
统一账号体系带来的跨类型计费与额度管理问题不在本文档中展开。
78+
79+
### Tutorial 与 Project Type 的关系
80+
81+
Tutorial 系统保持统一,不按 Project Type 拆分为独立产品线。
82+
83+
一个 Course 或 Course Series 可以与某类 Project Type 相关,也可以类型无关。例如:
84+
85+
* "做一个平台跳跃游戏"面向 `game`
86+
* "画一个四格漫画"面向 `comic`
87+
* "让机器人沿线巡逻"面向 `robot-app`
88+
* "认识 Builder 首页"与具体类型无关
89+
90+
因此:
91+
92+
* `Course Series``Course` 不记录 Project Type 信息。
93+
* 课程与类型的关联体现在课程设计语义与所引用的样例 Project 上,而非数据建模层面的强关联。
94+
95+
### XBP
96+
97+
XBP 是 XBuilder 的项目文件格式,用于本地导入导出 Project。
98+
99+
在多类型设计下,XBP 定义为类型无关的统一项目包格式:
100+
101+
* 所有 Project Type 均可导出为 `.xbp`
102+
* XBP 作为外层容器保持统一,不同 Project Type 在其内部可拥有不同的内容结构。
103+
* XBP 元数据中必须包含 Project Type,以便导入时选择正确的处理逻辑。
104+
105+
### Copilot 与 Project Type 的关系
106+
107+
Copilot 应跟随 Builder 支持的 Project Type 一同扩展,而非仅服务于单一类型。
108+
109+
具体而言:
110+
111+
* Copilot 应支持所有已支持 Project Type 对应的界面与工作流,包括不同类型的编辑器及相关交互。
112+
* Copilot 需能按需加载不同 Project Type 的领域知识与工具。
113+
114+
### Asset Library 与 Project Type 的关系
115+
116+
Asset Library 是 XBuilder 的统一资源复用机制,不按 Project Type 拆分。
117+
118+
约定如下:
119+
120+
* 各 Project Type 共用同一套 Asset Library 机制。
121+
* 不同 Project Type 可复用的 Asset Type 可能不同。
122+
* 不同 Project Type 不要求共享同一批 asset 数据;是否共享取决于它们能否消费相同的 Asset Type。
123+
* Asset Library 能力层保持统一;所承载的 asset 数据按各 Project Type 可消费的 Asset Type 组织。
124+
125+
### 兼容性规则
126+
127+
为保证向后兼容,明确以下原则:
128+
129+
* 历史上无显式 Project Type 的 Project,默认视为 `game`
130+
* 历史 `.xbp` 文件若缺少 Project Type,默认按 `game` 处理。
131+
* 系统遇到当前版本不支持的类型时,应明确提示用户,而非静默失败。
132+
133+
## User story
134+
135+
本部分关注用户如何在具体页面与交互流程中感知和使用多类型 Project。
136+
137+
所有展示 Project 列表的场景(首页、个人项目页、喜欢页、搜索结果、打开项目模态框等)均应通过 Badge、Icon 或文案标识项目类型,且类型信息应在用户做出点击决策前可见。
138+
139+
### 查看首页
140+
141+
首页作为跨类型总入口,不按类型拆分。承担两类作用:
142+
143+
* 帮助用户快速继续创作、管理项目。
144+
* 帮助用户发现不同类型的公开内容,进入对应的 Explore 页面。
145+
146+
多类型方案下,首页按 Project Type 分设展示区块,每个区块作为对应类型的探索入口。当前版本中可类比为 "The community is liking""The community is remixing" 等内容区块,后续进一步按类型组织。
147+
148+
区块的主要作用是引导用户进入对应类型的 Explore 页面(如 `/explore/game`),而非在首页内完成深度浏览。
149+
150+
### 新建项目
151+
152+
用户发起"新建项目"时,须先选择目标 Type。该场景继续使用当前的创建模态框,沿用导航栏的"新建项目"入口,不引入新路由。
153+
154+
用户点击"新建项目"后,先在模态框中选择 Project Type,再填写项目名等信息。创建完成后直接进入该类型对应的编辑器。
155+
156+
### 浏览用户相关项目
157+
158+
查看某用户的项目列表或喜欢的项目时,默认展示全部类型,并提供 Type Filter。Type 通过 URL query 参数表达,无 `type` 参数时表示全部类型。例如:
159+
160+
* 个人项目:`/user/<user>/projects?type=game`
161+
* 喜欢的项目:`/user/<user>/likes?type=game`
162+
163+
### 搜索项目
164+
165+
搜索为跨类型聚合场景,通过 query 参数筛选。无 `type` 参数时返回全部类型的匹配结果,并提供 Type Filter。例如:
166+
167+
* `/search?q=platform&type=game`
168+
169+
### 打开项目
170+
171+
"打开项目"保持为模态框,默认展示用户全部类型的 Project,并提供 Type Filter。
172+
173+
用户选择项目后,系统根据该 Project 的实际类型决定跳转目标,而非依据当前页面上下文。
174+
175+
### 探索某一类项目
176+
177+
Explore 是按类型区分的发现页,Type 体现在 URL path 中:
178+
179+
* `/explore/game`
180+
181+
每个 Project Type 有独立的 Explore 入口。与首页、搜索等跨类型聚合场景不同,Explore 专注于单一类型的内容发现。
182+
183+
不同类型的 Explore 可采用不同的内容组织、推荐维度和视觉布局。例如:
184+
185+
* `game`:强调可玩性、题材、互动体验。
186+
* `comic`:强调画面、叙事、风格与主题。
187+
* `robot-app`:强调设备能力、应用场景、控制逻辑。
188+
189+
### 查看项目详情
190+
191+
详情页应明确体现 Project 的类型,并展示与之匹配的内容结构。
192+
193+
路由将 Type 置于 path 中:
194+
195+
* `/<type>/<user>/<name>`
196+
* 例如:`/game/alice/hello`
197+
198+
页面根据 type 进入对应的渲染逻辑。详情页保留统一骨架(标题区、作者信息、基础操作区等),同时允许不同类型注入差异化模块。
199+
200+
### 打开并编辑项目
201+
202+
编辑器根据 Project Type 进入对应的编辑环境。路由形式:
203+
204+
* `/<type>/<user>/<name>/edit`
205+
* 例如:`/game/alice/hello/edit`
206+
207+
系统根据路由中的 type 选择编辑逻辑。从项目列表、打开项目模态框、详情页等入口进入编辑器时,跳转目标均由 Project 的实际类型决定。
208+
209+
### 导入或导出项目
210+
211+
导出时,所有类型统一导出为 `.xbp`。导入时,系统根据文件中记录的 Project Type 恢复对应的 Project。
212+
213+
若导入文件的类型与当前上下文不一致,系统应提示用户或引导进入正确的类型上下文,而非静默失败。

0 commit comments

Comments
 (0)