Files
bq_react/doc/项目文档/功能模块/首页/首页(home).md

88 lines
2.5 KiB
Markdown

# 首页
## 目录
- [模块目录结构](#模块目录结构)
- [功能定义](#功能定义)
- [核心业务层](#核心业务层)
- [HomeViewModel](#homeviewmodel)
- [核心模型](#核心模型)
- [核心业务](#核心业务)
- [列出并新建](#列出并新建)
## 模块目录结构
```text
src/features/home/
└── presentation/
└── home/
├── home.tsx
├── home.scss
└── home_view_model.ts
```
首页没有 `application`、`domain`、`infra`。
## 功能定义
首页不持有独立用例。它调用项目模块的 `list` 和 `create`。
- 进入页面时按 `local` 与 `remote` 各列出一份项目。
- 新建时调用 `ProjectApplication.create`。聚合由 `Project.create` 生成,再按 `store` 保存。
已登录状态来自安全模块一侧的 `authenticated`。未登录时,`projectId` 不交给编辑器。
## 核心业务层
### HomeViewModel
首页的项目列表状态。文件:`src/features/home/presentation/home/home_view_model.ts`。继承 `PageViewModel`。
状态:`cloudProjects`、`localProjects`、`errorMessage`。
| 方法 | 说明 |
|---|---|
| `ready(): Promise<void>` | 进入页面时调用 `reload` |
| `reload(): Promise<void>` | 调用 `ProjectApplication.list(ProjectStore.REMOTE)` 和 `list(ProjectStore.LOCAL)` |
| `createLocal(): Promise<Project>` | 调用 `ProjectApplication.create(ProjectStore.LOCAL)` |
`local` 和 `remote` 是传给用例的 `store`,用来选择仓储。它们不是 `Project` 的属性。
## 核心模型
首页不定义实体。它使用项目模块的聚合根 `Project`。
```mermaid
flowchart LR
HomeViewModel((HomeViewModel))
list([list])
create([create])
Project
HomeViewModel --> list
HomeViewModel --> create
list --> Project
create --> Project
```
`list` 的结果写入 `cloudProjects` 或 `localProjects`。`create` 返回新建的 `Project`。
## 核心业务
### 列出并新建
```mermaid
sequenceDiagram
participant HomeViewModel
participant ProjectApplication
participant Project
HomeViewModel->>ProjectApplication: list(remote)
HomeViewModel->>ProjectApplication: list(local)
HomeViewModel->>ProjectApplication: create(local)
ProjectApplication->>Project: create(name)
ProjectApplication-->>HomeViewModel: Project
```
`ready` 触发两次 `list`。其中一次失败时,对应列表为空,错误写入 `errorMessage`。`create` 返回的 `Project.id` 与本次使用的 `store` 一起交给编辑器。