Skip to content

Commit 12ebc81

Browse files
docs: 添加软件开发说明书(白皮书) (#13)
* docs: 完成软件开发说明书(白皮书) 包含以下内容: - 第一篇:产品篇(产品愿景、用户画像、用户故事) - 第二篇:设计篇(交互设计、视觉设计、设计原则) - 第三篇:架构篇(技术选型、系统架构、导航系统、状态管理) - 第四篇:服务篇(服务架构、链服务接口、平台服务、事件系统) - 第五篇:组件篇(组件体系、表单系统、组件开发规范) - 第六篇:安全篇(密钥管理、身份认证、DWEB授权) - 第七篇:国际化篇(多语言支持、本地化规范) - 第八篇:测试篇(测试策略、Vitest配置、Playwright配置) - 第九篇:部署篇(构建配置、发布流程) - 附录(术语表、链网络列表、mpay迁移指南、API参考) Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> * docs: 配置 VitePress 白皮书侧边栏和导航 - 添加 /white-book/ 多侧边栏配置 - 前三篇默认展开,后续章节默认折叠 - 顶部导航添加「开发说明书」入口 - 主侧边栏添加白皮书链接 Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> * feat(docs): 自动生成白皮书侧边栏 - 添加 sidebar-white-book.ts 脚本自动扫描目录生成侧边栏 - 根据目录名 XX-名称 自动排序和命名 - 前3篇默认展开,其余折叠 - 添加附录/index.md 修复死链接 - 简化 config.ts,移除硬编码侧边栏 Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> * refactor(docs): 重构为抽象规范文档 将实现指南改为技术无关的规范文档: 组件篇: - 组件规范:使用状态机定义组件行为 - 表单规范:定义验证规则和状态转换 - 交互规范:触摸、手势、动效、可访问性 架构篇: - 技术选型 → 技术需求:定义能力需求而非具体技术 服务篇: - 服务架构:适配器模式的抽象定义 - 链服务接口:移除实现代码,保留接口规范 - 平台服务:跨平台能力的抽象接口 目标:让 AI 根据规范可以用任意技术栈实现产品 Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> * feat(docs): 组件篇拆分为独立组件文件 新目录结构: - 01-基础组件/:Button, Input, Card, Sheet, Dialog, Toast - 02-通用组件/:AddressDisplay, AmountDisplay, TokenIcon, QRCode - 03-钱包组件/:WalletCard, ChainSelector, TransactionItem - 04-布局组件/:AppLayout, TabBar, Header - 05-表单系统/:表单状态机、验证规范 - 06-交互规范/:触摸、手势、动效、可访问性 每个组件都有独立的规范文件,包含: - 属性规范 - 状态机定义 - 行为规范 (MUST/SHOULD/MAY) - 布局规范 - 设计标注 Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> * feat(docs): 拆分服务篇为独立服务接口文件 - 链服务: IIdentityService, IAssetService, ITransactionService, IChainService, IStakingService - 平台服务: IBiometricService, IStorageService, ICameraService, IDeepLinkService Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> * feat(docs): 添加平台服务接口 IClipboardService, IShareService, IHapticService Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> * refactor(docs): 重构所有章节为抽象规范文档 - 架构篇: 系统架构、导航系统、状态管理 - 服务篇: 事件系统 - 安全篇: 密钥管理、身份认证 - 国际化篇: 多语言支持 - 测试篇: 单元测试规范 - 部署篇: 构建配置 移除所有具体代码实现,保留 MUST/SHOULD/MAY 规范 Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> * fix(docs): 修复死链接 - 更新链服务目录引用 Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> * feat(docs): 白皮书重大扩展 - 新增 5 篇章节和 6 个附录 新增章节: - 10-离线能力篇: 离线检测、缓存策略、离线签名、数据同步 - 11-错误处理篇: 错误码目录、恢复策略、UI规范、日志上报 - 12-性能预算篇: 加载指标、操作预算、包体积、内存限制 - 13-数据迁移篇: 版本化存储、迁移策略、向后兼容 - 14-监控告警篇: 埋点规范、性能监控、错误上报、告警规则 增强章节: - 06-安全篇: 新增安全审计清单、攻击防护规范 - 08-测试篇: 新增性能测试和安全测试规范 新增附录: - E-状态机规范: 转账、创建钱包、授权、应用锁等状态机 - F-边界条件目录: 各功能边界条件和处理方式 - G-网络故障矩阵: 故障场景检测和处理策略 Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> * refactor(docs): 重新组织章节结构 将独立章节归入现有篇章: - 03-架构篇: +05-离线能力, +06-错误处理, +07-性能预算 - 09-部署篇: +03-数据迁移, +04-监控告警 保持9篇+附录的整体结构 Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> --------- Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
1 parent 1e11651 commit 12ebc81

87 files changed

Lines changed: 16708 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎docs/.vitepress/config.ts‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import { defineConfig } from 'vitepress'
22
import { webappLoaderPlugin } from './plugins/webapp-loader'
3+
import { generateWhiteBookSidebar } from './sidebar-white-book'
34

45
const GITHUB_OWNER = 'BioforestChain'
56
const GITHUB_REPO = 'KeyApp'
67

8+
// 自动生成白皮书侧边栏
9+
const whiteBookSidebar = generateWhiteBookSidebar()
10+
711
/**
812
* Base URL 配置
913
* - 开发环境:使用 '/'
@@ -33,12 +37,14 @@ export default defineConfig({
3337
nav: [
3438
{ text: '首页', link: '/' },
3539
{ text: '下载', link: '/download' },
40+
{ text: '开发说明书', link: '/white-book/' },
3641
{ text: 'Storybook', link: './storybook/' },
3742
{ text: '贡献指南', link: '/contributing' },
3843
{ text: '更新日志', link: '/changelog' },
3944
],
4045

4146
sidebar: {
47+
'/white-book/': whiteBookSidebar,
4248
'/': [
4349
{
4450
text: '开始使用',
@@ -52,6 +58,7 @@ export default defineConfig({
5258
text: '开发者',
5359
items: [
5460
{ text: '贡献指南', link: '/contributing' },
61+
{ text: '软件开发说明书', link: '/white-book/' },
5562
],
5663
},
5764
],
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
import fs from 'node:fs'
2+
import path from 'node:path'
3+
import type { DefaultTheme } from 'vitepress'
4+
5+
type SidebarItem = DefaultTheme.SidebarItem
6+
7+
interface FileMeta {
8+
order: number
9+
name: string
10+
isDir: boolean
11+
collapsed?: boolean
12+
}
13+
14+
/**
15+
* 从文件/目录名解析排序和显示名称
16+
* 例如: "01-产品篇" -> { order: 1, name: "产品篇" }
17+
* 例如: "Button.md" -> { order: 500, name: "Button" }
18+
*/
19+
function parseFileName(fileName: string, isDir: boolean): FileMeta {
20+
// 移除 .md 扩展名
21+
const baseName = fileName.replace(/\.md$/, '')
22+
23+
const match = baseName.match(/^(\d+)-(.+)$/)
24+
if (match) {
25+
return {
26+
order: parseInt(match[1], 10),
27+
name: match[2],
28+
isDir,
29+
}
30+
}
31+
32+
// 特殊处理:附录放最后
33+
if (baseName === '附录') {
34+
return { order: 999, name: '附录', isDir, collapsed: true }
35+
}
36+
37+
// index 文件不单独显示
38+
if (baseName === 'index') {
39+
return { order: -1, name: '', isDir: false }
40+
}
41+
42+
return { order: 500, name: baseName, isDir }
43+
}
44+
45+
/**
46+
* 读取 markdown 文件获取标题
47+
*/
48+
function getTitle(filePath: string, fallback: string): string {
49+
try {
50+
const content = fs.readFileSync(filePath, 'utf-8')
51+
const match = content.match(/^#\s+(.+)$/m)
52+
if (match) {
53+
return match[1].trim()
54+
}
55+
} catch {
56+
// 文件不存在或读取失败
57+
}
58+
return fallback
59+
}
60+
61+
/**
62+
* 扫描目录生成侧边栏项
63+
*/
64+
function scanDirectory(
65+
dirPath: string,
66+
urlBase: string,
67+
depth: number = 0
68+
): SidebarItem[] {
69+
const items: Array<SidebarItem & { _order: number }> = []
70+
71+
let entries: fs.Dirent[]
72+
try {
73+
entries = fs.readdirSync(dirPath, { withFileTypes: true })
74+
} catch {
75+
return []
76+
}
77+
78+
for (const entry of entries) {
79+
if (entry.name.startsWith('.')) continue
80+
81+
const entryPath = path.join(dirPath, entry.name)
82+
const meta = parseFileName(entry.name, entry.isDirectory())
83+
84+
// 跳过 index 文件(由父目录处理)
85+
if (meta.order === -1) continue
86+
87+
if (entry.isDirectory()) {
88+
const subUrlBase = `${urlBase}${entry.name}/`
89+
const indexPath = path.join(entryPath, 'index.md')
90+
91+
// 检查是否有 index.md
92+
const hasIndex = fs.existsSync(indexPath)
93+
if (!hasIndex) continue
94+
95+
const title = getTitle(indexPath, meta.name)
96+
const children = scanDirectory(entryPath, subUrlBase, depth + 1)
97+
98+
const item: SidebarItem & { _order: number } = {
99+
_order: meta.order,
100+
text: title,
101+
link: subUrlBase,
102+
}
103+
104+
if (children.length > 0) {
105+
item.items = children
106+
// 深度 0(篇):前3个展开,其余折叠
107+
// 深度 1+(章/节):默认展开
108+
if (depth === 0) {
109+
item.collapsed = meta.collapsed ?? meta.order > 3
110+
}
111+
}
112+
113+
items.push(item)
114+
115+
} else if (entry.name.endsWith('.md')) {
116+
// 单独的 markdown 文件
117+
const title = getTitle(entryPath, meta.name)
118+
const link = `${urlBase}${entry.name.replace(/\.md$/, '')}`
119+
120+
items.push({
121+
_order: meta.order,
122+
text: title,
123+
link,
124+
})
125+
}
126+
}
127+
128+
// 按 order 排序
129+
items.sort((a, b) => a._order - b._order)
130+
131+
// 移除 _order 字段
132+
return items.map(({ _order, ...rest }) => rest)
133+
}
134+
135+
/**
136+
* 生成白皮书侧边栏配置
137+
*/
138+
export function generateWhiteBookSidebar(): SidebarItem[] {
139+
const whiteBookDir = path.resolve(__dirname, '../white-book')
140+
const indexPath = path.join(whiteBookDir, 'index.md')
141+
142+
const rootTitle = getTitle(indexPath, '软件开发说明书')
143+
const items = scanDirectory(whiteBookDir, '/white-book/', 0)
144+
145+
return [
146+
{
147+
text: rootTitle,
148+
link: '/white-book/',
149+
items,
150+
},
151+
]
152+
}

‎docs/index.md‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ features:
3232
details: 使用 Storybook 构建的现代化 React 组件库
3333
link: ./storybook/
3434
target: _self
35+
- icon: 📚
36+
title: 开发文档
37+
details: 完整的软件开发说明书,涵盖产品、设计、架构、服务等
38+
link: ./white-book/
39+
linkText: 阅读文档
3540
---
3641

3742
## 快速开始
@@ -48,3 +53,17 @@ features:
4853
| **DWEB** | [下载页面](./download) | [下载页面](./download) |
4954

5055
查看 [下载页面](./download) 了解更多版本信息。
56+
57+
## 开发文档
58+
59+
[《软件开发说明书》](./white-book/) 是 BFM Pay 的完整技术文档,适合开发者和产品人员阅读。
60+
61+
| 篇章 | 内容 | 推荐读者 |
62+
|------|------|---------|
63+
| [产品篇](./white-book/01-产品篇/) | 产品愿景、用户画像、用户故事 | 产品经理 |
64+
| [设计篇](./white-book/02-设计篇/) | 交互设计、视觉设计、设计原则 | 设计师 |
65+
| [架构篇](./white-book/03-架构篇/) | 技术选型、系统架构、导航、状态管理 | 前端开发 |
66+
| [服务篇](./white-book/04-服务篇/) | 服务架构、链服务接口、平台服务 | 后端开发 |
67+
| [组件篇](./white-book/05-组件篇/) | 组件体系、表单系统、开发规范 | 前端开发 |
68+
| [安全篇](./white-book/06-安全篇/) | 密钥管理、身份认证、DWEB授权 | 安全工程师 |
69+
| [测试篇](./white-book/08-测试篇/) | 测试策略、Vitest、Playwright | 测试工程师 |
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
# 第一章:产品愿景
2+
3+
> **让每个人都能安全、简单地管理自己的数字资产。**
4+
5+
---
6+
7+
## 1.1 产品定位
8+
9+
BFM Pay 是一款**多链数字钱包移动应用**,目标是成为用户进入 Web3 世界的可信赖入口。
10+
11+
### 核心理念
12+
13+
我们相信:**复杂的区块链技术不应成为普通用户的障碍。**
14+
15+
| 传统钱包的问题 | BFM Pay 的解决方案 |
16+
|--------------|-------------------|
17+
| 需要理解"助记词""Gas费"等概念 | 用通俗语言解释,引导式操作 |
18+
| 多个钱包管理不同链的资产 | 一个钱包,多链支持 |
19+
| 界面复杂,功能堆砌 | 渐进式复杂度,新手友好 |
20+
| 转错地址无法挽回 | 多重确认,地址簿管理 |
21+
22+
### 产品形态
23+
24+
```
25+
┌─────────────────────────────────────────┐
26+
│ BFM Pay │
27+
├─────────────────────────────────────────┤
28+
│ │
29+
│ ┌─────────┐ ┌─────────┐ │
30+
│ │ Web │ │ DWEB │ │
31+
│ │ 版本 │ │ 版本 │ │
32+
│ └────┬────┘ └────┬────┘ │
33+
│ │ │ │
34+
│ └────────┬────────┘ │
35+
│ │ │
36+
│ ┌───────▼───────┐ │
37+
│ │ 统一核心 │ │
38+
│ │ React + TS │ │
39+
│ └───────────────┘ │
40+
│ │
41+
└─────────────────────────────────────────┘
42+
```
43+
44+
- **Web 版本**:浏览器访问,无需安装
45+
- **DWEB 版本**:Plaoc 原生应用,更深度的系统集成
46+
47+
---
48+
49+
## 1.2 目标市场
50+
51+
### 主要市场
52+
53+
**BioforestChain 生态用户**
54+
- BFMeta、PMChain、CCChain 等链的持有者
55+
- 需要与 DWEB 应用交互的用户
56+
- 参与生态质押和投票的用户
57+
58+
### 拓展市场
59+
60+
**主流公链用户**
61+
- Ethereum、BSC、Tron 等链的持有者
62+
- 寻找多链管理方案的用户
63+
- 对安全性有较高要求的用户
64+
65+
---
66+
67+
## 1.3 价值主张
68+
69+
### 对用户的价值
70+
71+
```
72+
┌─────────────────────────────────────────────────┐
73+
│ │
74+
│ 🔐 安全 → 私钥本地存储,永不上传 │
75+
│ │
76+
│ 🌐 多链 → 一个钱包,管理所有链资产 │
77+
│ │
78+
│ 📱 便捷 → 随时随地,轻松转账收款 │
79+
│ │
80+
│ 🔗 生态 → 无缝连接 DWEB 应用 │
81+
│ │
82+
└─────────────────────────────────────────────────┘
83+
```
84+
85+
### 核心功能价值
86+
87+
| 功能 | 用户价值 | 技术实现 |
88+
|-----|---------|---------|
89+
| 创建钱包 | 30秒拥有自己的数字身份 | 助记词生成 + 多链派生 |
90+
| 资产查看 | 一目了然的资产状况 | 多链余额聚合 |
91+
| 转账收款 | 像发微信一样简单 | 统一的转账流程 |
92+
| 跨链质押 | 参与生态建设,获取收益 | Mint/Burn 机制 |
93+
| DWEB 授权 | 安全地与应用交互 | Plaoc 协议 |
94+
95+
---
96+
97+
## 1.4 与 mpay 的关系
98+
99+
BFM Pay 是 mpay 的**技术重构版本**,而非简单的 UI 改版。
100+
101+
### 保留
102+
103+
- ✅ 核心业务逻辑
104+
- ✅ 多链支持能力
105+
- ✅ DWEB 协议兼容
106+
- ✅ 用户数据格式
107+
108+
### 提升
109+
110+
| 方面 | mpay (Angular) | BFM Pay (React) |
111+
|-----|---------------|-----------------|
112+
| 框架 | Angular 15 | React 19 |
113+
| 状态管理 | Service + RxJS | TanStack Store/Query |
114+
| 导航 | Angular Router | Stackflow |
115+
| 组件库 | Ionic | shadcn/ui |
116+
| 测试 | Jasmine | Vitest + Playwright |
117+
| 文档 | 无 | Storybook |
118+
119+
### 原则
120+
121+
```
122+
参考,而非复制
123+
```
124+
125+
- 理解 mpay 的业务逻辑,不是复制代码
126+
- 质疑原始实现,发现并修复问题
127+
- 使用现代化技术栈重新实现
128+
129+
---
130+
131+
## 1.5 成功指标
132+
133+
### 用户体验指标
134+
135+
| 指标 | 目标 |
136+
|-----|------|
137+
| 首次创建钱包时间 | < 60秒 |
138+
| 完成一笔转账时间 | < 30秒 |
139+
| 新用户次日留存率 | > 40% |
140+
| 用户满意度 (NPS) | > 50 |
141+
142+
### 技术质量指标
143+
144+
| 指标 | 目标 |
145+
|-----|------|
146+
| 单元测试覆盖率 | > 70% |
147+
| E2E 测试通过率 | 100% |
148+
| Lighthouse 性能分 | > 90 |
149+
| 首屏加载时间 | < 2秒 |
150+
151+
---
152+
153+
## 本章小结
154+
155+
- BFM Pay 的愿景是让数字资产管理变得安全、简单
156+
- 核心定位是多链钱包,服务 BioforestChain 生态和主流公链用户
157+
- 是 mpay 的技术重构,保留业务逻辑,提升技术栈和用户体验
158+
- 成功需要同时满足用户体验和技术质量指标
159+
160+
---
161+
162+
## 下一章
163+
164+
继续阅读 [第二章:用户画像](../02-用户画像/),深入了解我们的目标用户。

0 commit comments

Comments
 (0)