Epics and Stories (Final): asset-light MVP
版本: 2.0.0 (Final)
日期: 2025-12-20
关联文档:
概览
本文档是基于技术架构设计的最终版 Epics 和 Stories,包含具体的技术实现任务。
Epic 总览
| Epic ID | 名称 | Stories | 任务数 | 预计工时 |
|---|---|---|---|---|
| E0 | 项目基础设施 | 4 | 16 | 3-4 天 |
| E1 | 资产盘点模块 | 8 | 28 | 5-7 天 |
| E2 | 配置方案模块 | 6 | 20 | 3-5 天 |
| E3 | 资产视图模块 | 5 | 18 | 3-4 天 |
| E4 | 收益分析模块 | 5 | 16 | 3-4 天 |
| 合计 | - | 28 | 98 | 17-24 天 |
E0: 项目基础设施
E0-S1: 项目初始化
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T0-1-1 | 创建 Cargo 项目 | Cargo.toml |
| T0-1-2 | 配置 Dioxus Desktop 依赖 | Cargo.toml |
| T0-1-3 | 创建 Dioxus.toml 配置 | Dioxus.toml |
| T0-1-4 | 创建目录结构 | src/* |
| T0-1-5 | 创建 main.rs 入口 | src/main.rs |
| T0-1-6 | 配置 rustfmt.toml | rustfmt.toml |
代码模板
Cargo.toml:
[package]
name = "asset-light"
version = "0.1.0"
edition = "2021"
[dependencies]
dioxus = { version = "0.5", features = ["desktop", "router"] }
rusqlite = { version = "0.31", features = ["bundled"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
uuid = { version = "1.0", features = ["v4", "serde"] }
chrono = { version = "0.4", features = ["serde"] }
rust_decimal = { version = "1.0", features = ["serde"] }
dirs = "5.0"
thiserror = "1.0"
验收标准:
-
cargo build编译成功 -
cargo run启动空白窗口 - 目录结构符合架构设计
E0-S2: 数据持久化层
预计工时: 1 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T0-2-1 | 创建 Database 连接管理 | src/db/connection.rs |
| T0-2-2 | 实现数据库路径管理 | src/db/connection.rs |
| T0-2-3 | 创建迁移脚本 001_create_assets | migrations/001_create_assets.sql |
| T0-2-4 | 创建迁移脚本 002_create_snapshots | migrations/002_create_snapshots.sql |
| T0-2-5 | 创建迁移脚本 003_create_plans | migrations/003_create_plans.sql |
| T0-2-6 | 实现迁移执行逻辑 | src/db/migrations.rs |
SQL 迁移脚本
001_create_assets.sql:
CREATE TABLE IF NOT EXISTS assets (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
category TEXT NOT NULL CHECK (category IN ('Cash', 'Stable', 'Advanced')),
sub_category TEXT,
current_value TEXT NOT NULL,
notes TEXT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_assets_category ON assets(category);
002_create_snapshots.sql:
CREATE TABLE IF NOT EXISTS snapshots (
id TEXT PRIMARY KEY,
snapshot_date TEXT NOT NULL,
created_at TEXT NOT NULL,
total_value TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_snapshots_date ON snapshots(snapshot_date);
CREATE TABLE IF NOT EXISTS snapshot_items (
id INTEGER PRIMARY KEY AUTOINCREMENT,
snapshot_id TEXT NOT NULL,
asset_id TEXT NOT NULL,
asset_name TEXT NOT NULL,
category TEXT NOT NULL,
sub_category TEXT,
value TEXT NOT NULL,
FOREIGN KEY (snapshot_id) REFERENCES snapshots(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS idx_snapshot_items_snapshot ON snapshot_items(snapshot_id);
003_create_plans.sql:
CREATE TABLE IF NOT EXISTS allocation_plans (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
description TEXT,
is_active INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS allocations (
id INTEGER PRIMARY KEY AUTOINCREMENT,
plan_id TEXT NOT NULL,
category TEXT NOT NULL,
target_percentage TEXT NOT NULL,
min_percentage TEXT,
max_percentage TEXT,
FOREIGN KEY (plan_id) REFERENCES allocation_plans(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS idx_allocations_plan ON allocations(plan_id);
验收标准:
-
数据库文件创建在
~/Library/Application Support/asset-light/data.db - 迁移执行成功
- 表结构正确
E0-S3: 应用布局框架
预计工时: 1 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T0-3-1 | 定义路由枚举 | src/router.rs |
| T0-3-2 | 创建 Layout 组件 | src/components/layout/mod.rs |
| T0-3-3 | 创建 Sidebar 组件 | src/components/layout/sidebar.rs |
| T0-3-4 | 创建 NavItem 组件 | src/components/layout/sidebar.rs |
| T0-3-5 | 创建 PageContainer 组件 | src/components/layout/page_container.rs |
| T0-3-6 | 创建 5 个页面占位组件 | src/pages/*.rs |
组件结构
src/components/layout/
├── mod.rs // pub mod sidebar; pub mod page_container;
├── sidebar.rs // Sidebar, NavItem
└── page_container.rs
src/pages/
├── mod.rs
├── home.rs // HomePage
├── assets.rs // AssetsPage
├── history.rs // HistoryPage
├── plans.rs // PlansPage
└── analysis.rs // AnalysisPage
验收标准:
- 侧边栏显示 5 个导航项
- 点击导航项切换页面
- 当前页面导航项高亮
E0-S4: 全局状态管理
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T0-4-1 | 定义 AppState 结构体 | src/state/app_state.rs |
| T0-4-2 | 实现 provide_app_state | src/state/app_state.rs |
| T0-4-3 | 实现 use_app_state Hook | src/state/app_state.rs |
| T0-4-4 | 在 App 组件中提供状态 | src/app.rs |
状态结构
#![allow(unused)] fn main() { // src/state/app_state.rs #[derive(Clone, Default)] pub struct AppState { pub assets: Vec<Asset>, pub snapshots: Vec<Snapshot>, pub plans: Vec<AllocationPlan>, pub active_plan: Option<AllocationPlan>, pub is_inventory_mode: bool, pub loading: bool, pub error: Option<String>, } }
验收标准:
- 全局状态在所有页面可访问
- 状态变更触发 UI 更新
E1: 资产盘点模块
E1-S1: 资产条目数据模型
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T1-1-1 | 定义 Category 枚举 | src/models/category.rs |
| T1-1-2 | 定义 Asset 结构体 | src/models/asset.rs |
| T1-1-3 | 实现 Asset::new() | src/models/asset.rs |
| T1-1-4 | 创建 AssetRepository | src/db/asset_repo.rs |
| T1-1-5 | 实现 CRUD 方法 | src/db/asset_repo.rs |
Repository 接口
#![allow(unused)] fn main() { // src/db/asset_repo.rs impl AssetRepository { pub fn insert(&self, asset: &Asset) -> Result<()>; pub fn update(&self, asset: &Asset) -> Result<()>; pub fn delete(&self, id: Uuid) -> Result<()>; pub fn find_by_id(&self, id: Uuid) -> Result<Option<Asset>>; pub fn find_all(&self) -> Result<Vec<Asset>>; pub fn find_by_category(&self, category: Category) -> Result<Vec<Asset>>; } }
验收标准:
- 资产可增删改查
- 按类别查询正常
E1-S2: 新增资产条目
预计工时: 1 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T1-2-1 | 创建 Modal 通用组件 | src/components/common/modal.rs |
| T1-2-2 | 创建 Input 通用组件 | src/components/common/input.rs |
| T1-2-3 | 创建 Select 通用组件 | src/components/common/select.rs |
| T1-2-4 | 创建 Button 通用组件 | src/components/common/button.rs |
| T1-2-5 | 创建 AssetForm 组件 | src/components/asset/asset_form.rs |
| T1-2-6 | 创建 AssetService | src/services/asset_service.rs |
| T1-2-7 | 实现表单验证逻辑 | src/components/asset/asset_form.rs |
组件 Props
#![allow(unused)] fn main() { #[component] pub fn AssetForm( asset: Option<Asset>, // None = 新增, Some = 编辑 on_save: EventHandler<Asset>, on_cancel: EventHandler<()>, ) -> Element }
验收标准:
- 点击新增按钮弹出表单
- 表单验证生效
- 保存成功关闭表单
E1-S3: 编辑资产条目
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T1-3-1 | AssetItem 添加编辑按钮 | src/components/asset/asset_item.rs |
| T1-3-2 | 复用 AssetForm 组件 | src/pages/assets.rs |
| T1-3-3 | 实现编辑状态管理 | src/pages/assets.rs |
验收标准:
- 点击编辑打开预填充表单
- 保存更新资产信息
E1-S4: 删除资产条目
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T1-4-1 | 创建 ConfirmDialog 组件 | src/components/common/confirm_dialog.rs |
| T1-4-2 | AssetItem 添加删除按钮 | src/components/asset/asset_item.rs |
| T1-4-3 | 实现删除确认流程 | src/pages/assets.rs |
验收标准:
- 点击删除弹出确认
- 确认后删除成功
E1-S5: 资产列表展示
预计工时: 1 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T1-5-1 | 创建 AssetList 组件 | src/components/asset/asset_list.rs |
| T1-5-2 | 创建 CategoryGroup 组件 | src/components/asset/category_group.rs |
| T1-5-3 | 创建 AssetItem 组件 | src/components/asset/asset_item.rs |
| T1-5-4 | 实现折叠/展开功能 | src/components/asset/category_group.rs |
| T1-5-5 | 实现汇总计算 | src/pages/assets.rs |
组件层次
AssetList
├── CategoryGroup (Cash)
│ ├── AssetItem
│ └── AssetItem
├── CategoryGroup (Stable)
│ └── AssetItem
└── CategoryGroup (Advanced)
└── AssetItem
验收标准:
- 资产按类别分组显示
- 显示类别汇总
- 折叠展开正常
E1-S6: 执行盘点操作
预计工时: 1.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T1-6-1 | 定义 Snapshot 模型 | src/models/snapshot.rs |
| T1-6-2 | 创建 SnapshotRepository | src/db/snapshot_repo.rs |
| T1-6-3 | 创建 SnapshotService | src/services/snapshot_service.rs |
| T1-6-4 | 创建 InventoryMode 组件 | src/components/snapshot/inventory_mode.rs |
| T1-6-5 | 创建 InventoryItem 组件 | src/components/snapshot/inventory_item.rs |
| T1-6-6 | 实现盘点次数限制检查 | src/services/snapshot_service.rs |
| T1-6-7 | 实现盘点保存逻辑 | src/services/snapshot_service.rs |
盘点流程
开始盘点 → 进入盘点模式 → 编辑各资产市值 → 完成盘点 → 创建快照 → 更新资产
验收标准:
- 盘点模式 UI 区分明显
- 可编辑各资产市值
- 快照正确保存
- 每日限制 5 次
E1-S7: 查看盘点历史列表
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T1-7-1 | 创建 SnapshotTimeline 组件 | src/components/snapshot/snapshot_timeline.rs |
| T1-7-2 | 创建 SnapshotCard 组件 | src/components/snapshot/snapshot_card.rs |
| T1-7-3 | 实现变化计算 | src/components/snapshot/snapshot_card.rs |
验收标准:
- 时间线展示历史
- 显示变化金额和百分比
E1-S8: 查看盘点快照详情
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T1-8-1 | 创建 SnapshotDetail 组件 | src/components/snapshot/snapshot_detail.rs |
| T1-8-2 | 实现详情弹窗或展开 | src/pages/history.rs |
验收标准:
- 可查看快照详细资产列表
E2: 配置方案模块
E2-S1: 配置方案数据模型
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T2-1-1 | 定义 AllocationPlan 结构体 | src/models/plan.rs |
| T2-1-2 | 定义 Allocation 结构体 | src/models/plan.rs |
| T2-1-3 | 创建 PlanRepository | src/db/plan_repo.rs |
| T2-1-4 | 实现默认方案创建 | src/db/plan_repo.rs |
验收标准:
- 首次启动创建默认方案
- 方案 CRUD 正常
E2-S2: 创建配置方案
预计工时: 1 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T2-2-1 | 创建 PlanEditor 组件 | src/components/plan/plan_editor.rs |
| T2-2-2 | 创建 AllocationSlider 组件 | src/components/plan/allocation_slider.rs |
| T2-2-3 | 实现 100% 验证逻辑 | src/components/plan/plan_editor.rs |
| T2-2-4 | 创建 PlanService | src/services/plan_service.rs |
验收标准:
- 可创建新方案
- 占比总和必须 100%
E2-S3: 编辑配置方案
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T2-3-1 | PlanCard 添加编辑按钮 | src/components/plan/plan_card.rs |
| T2-3-2 | 复用 PlanEditor | src/pages/plans.rs |
验收标准:
- 可编辑现有方案
E2-S4: 删除配置方案
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T2-4-1 | PlanCard 添加删除按钮 | src/components/plan/plan_card.rs |
| T2-4-2 | 实现删除限制检查 | src/services/plan_service.rs |
验收标准:
- 激活方案不可删除
- 最后一个方案不可删除
E2-S5: 激活配置方案
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T2-5-1 | PlanCard 添加激活按钮 | src/components/plan/plan_card.rs |
| T2-5-2 | 实现激活切换逻辑 | src/services/plan_service.rs |
| T2-5-3 | 更新全局状态 active_plan | src/state/app_state.rs |
验收标准:
- 可切换激活方案
- 始终只有一个激活
E2-S6: 预设方案模板
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T2-6-1 | 定义模板常量 | src/models/plan.rs |
| T2-6-2 | PlanEditor 添加模板选择 | src/components/plan/plan_editor.rs |
模板定义:
#![allow(unused)] fn main() { impl AllocationPlan { pub fn template_conservative() -> Self { /* Cash 30, Stable 50, Advanced 20 */ } pub fn template_balanced() -> Self { /* Cash 20, Stable 40, Advanced 40 */ } pub fn template_aggressive() -> Self { /* Cash 10, Stable 20, Advanced 70 */ } } }
验收标准:
- 提供 3 个模板
- 选择模板自动填充
E3: 资产视图模块
E3-S1: 资产总览卡片
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T3-1-1 | 创建 TotalCard 组件 | src/components/dashboard/total_card.rs |
| T3-1-2 | 创建 StatCard 通用组件 | src/components/common/stat_card.rs |
| T3-1-3 | 实现汇总计算 | src/pages/home.rs |
验收标准:
- 显示总资产
- 显示上次盘点日期
E3-S2: 配置对比图表
预计工时: 1 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T3-2-1 | 创建 PieChart 组件 | src/components/dashboard/pie_chart.rs |
| T3-2-2 | 创建 PieChartPair 组件 | src/components/dashboard/pie_chart_pair.rs |
| T3-2-3 | 实现 SVG 饼图渲染 | src/components/dashboard/pie_chart.rs |
| T3-2-4 | 实现悬停提示 | src/components/dashboard/pie_chart.rs |
验收标准:
- 双饼图并列显示
- 类别颜色一致
E3-S3: 偏离状态列表
预计工时: 1 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T3-3-1 | 创建 DeviationTable 组件 | src/components/dashboard/deviation_table.rs |
| T3-3-2 | 创建 StatusBadge 组件 | src/components/common/status_badge.rs |
| T3-3-3 | 创建 AnalysisService | src/services/analysis_service.rs |
| T3-3-4 | 实现 calculate_deviation | src/services/analysis_service.rs |
验收标准:
- 显示偏离度表格
- 状态颜色正确
E3-S4: 无数据状态处理
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T3-4-1 | 创建 EmptyState 组件 | src/components/common/empty_state.rs |
| T3-4-2 | 首页添加空状态处理 | src/pages/home.rs |
验收标准:
- 无数据时显示引导
E3-S5: 再平衡方向提示
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T3-5-1 | DeviationTable 添加方向列 | src/components/dashboard/deviation_table.rs |
| T3-5-2 | 实现方向箭头显示 | src/components/dashboard/deviation_table.rs |
验收标准:
- 显示调整方向
E4: 收益分析模块
E4-S1: 周期收益计算
预计工时: 1 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T4-1-1 | 创建 PeriodSelector 组件 | src/components/analysis/period_selector.rs |
| T4-1-2 | 创建 ReturnCard 组件 | src/components/analysis/return_card.rs |
| T4-1-3 | 实现 calculate_return | src/services/analysis_service.rs |
| T4-1-4 | 实现周期筛选逻辑 | src/pages/analysis.rs |
验收标准:
- 可选择季度/年度
- 正确计算收益
E4-S2: 收益归因分析
预计工时: 1 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T4-2-1 | 创建 AttributionTable 组件 | src/components/analysis/attribution_table.rs |
| T4-2-2 | 实现类别收益计算 | src/services/analysis_service.rs |
| T4-2-3 | 实现贡献度计算 | src/services/analysis_service.rs |
验收标准:
- 显示各类别收益
- 正负收益颜色区分
E4-S3: 资产趋势图
预计工时: 1 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T4-3-1 | 创建 TrendChart 组件 | src/components/analysis/trend_chart.rs |
| T4-3-2 | 实现 SVG 折线图 | src/components/analysis/trend_chart.rs |
| T4-3-3 | 实现悬停数据点提示 | src/components/analysis/trend_chart.rs |
验收标准:
- 折线图正确渲染
- 悬停显示详情
E4-S4: 自定义周期对比
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T4-4-1 | PeriodSelector 添加自定义入口 | src/components/analysis/period_selector.rs |
| T4-4-2 | 创建快照选择器 | src/components/analysis/snapshot_picker.rs |
验收标准:
- 可选择任意两个快照对比
E4-S5: 无数据状态处理
预计工时: 0.5 天
技术任务
| 任务 ID | 任务 | 文件/路径 |
|---|---|---|
| T4-5-1 | 分析页添加空状态处理 | src/pages/analysis.rs |
验收标准:
- 数据不足时友好提示
Sprint 规划建议
Sprint 1: 基础设施 (3-4 天)
- E0-S1: 项目初始化
- E0-S2: 数据持久化层
- E0-S3: 应用布局框架
- E0-S4: 全局状态管理
Sprint 2: 资产管理 (5-7 天)
- E1-S1: 资产数据模型
- E1-S2: 新增资产
- E1-S3: 编辑资产
- E1-S4: 删除资产
- E1-S5: 资产列表展示
Sprint 3: 盘点功能 (3-4 天)
- E1-S6: 执行盘点
- E1-S7: 盘点历史
- E1-S8: 快照详情
Sprint 4: 配置方案 (3-4 天)
- E2-S1 ~ E2-S6
Sprint 5: 仪表盘 (3-4 天)
- E3-S1 ~ E3-S5
Sprint 6: 收益分析 (3-4 天)
- E4-S1 ~ E4-S5
文件清单
需创建的文件 (共约 45 个)
src/models/ (5 个)
- mod.rs, asset.rs, snapshot.rs, plan.rs, category.rs
src/db/ (5 个)
- mod.rs, connection.rs, migrations.rs, asset_repo.rs, snapshot_repo.rs, plan_repo.rs
src/services/ (5 个)
- mod.rs, asset_service.rs, snapshot_service.rs, plan_service.rs, analysis_service.rs
src/state/ (2 个)
- mod.rs, app_state.rs
src/components/common/ (8 个)
- mod.rs, button.rs, input.rs, select.rs, modal.rs, card.rs, confirm_dialog.rs, empty_state.rs, status_badge.rs, stat_card.rs
src/components/layout/ (3 个)
- mod.rs, sidebar.rs, page_container.rs
src/components/asset/ (5 个)
- mod.rs, asset_list.rs, asset_form.rs, asset_item.rs, category_group.rs
src/components/snapshot/ (5 个)
- mod.rs, inventory_mode.rs, inventory_item.rs, snapshot_timeline.rs, snapshot_card.rs, snapshot_detail.rs
src/components/plan/ (4 个)
- mod.rs, plan_list.rs, plan_card.rs, plan_editor.rs, allocation_slider.rs
src/components/dashboard/ (4 个)
- mod.rs, total_card.rs, pie_chart.rs, pie_chart_pair.rs, deviation_table.rs
src/components/analysis/ (5 个)
- mod.rs, period_selector.rs, return_card.rs, attribution_table.rs, trend_chart.rs, snapshot_picker.rs
src/pages/ (6 个)
- mod.rs, home.rs, assets.rs, history.rs, plans.rs, analysis.rs
migrations/ (3 个)
- 001_create_assets.sql, 002_create_snapshots.sql, 003_create_plans.sql
修订历史
| 版本 | 日期 | 作者 | 变更说明 |
|---|---|---|---|
| 1.0.0 | 2025-12-20 | PM Agent | 初始版本 |
| 2.0.0 | 2025-12-20 | PM Agent | 基于架构添加技术任务 |