Files
SnapLedger/docs/implementation-plan.md
Misaka_Company 23588b584f Add Phase 1 infrastructure setup and implementation plan
- infrastructure-setup.md: MinIO bucket, access key, PostgreSQL database/user/table deployment guide
- implementation-plan.md: backend (FastAPI) and Android (Flutter) implementation roadmap
- .gitignore: exclude credential YAML files (connections-remote.yaml, connections-local.yaml)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-21 10:00:46 +08:00

4.9 KiB
Raw Blame History

SnapLedger Phase 1 实施计划

日期: 2026-05-21 范围: 后端 (FastAPI) + Android 端 (Flutter/Dart) 目标: 跑通端到端数据流 — 截图 → 上传 → 存储 → 入库

技术决策

决策项 选择 理由
Android 框架 Flutter / Dart 主仓库 README 已确定
后端框架 Python FastAPI 已确定
后端部署 Docker 容器 服务器已有 Docker 环境
API 鉴权 静态 Token (Header) Phase 1 个人使用,简单直接
数据库 PostgreSQL 18 (已部署)
对象存储 MinIO (已部署)

开发与部署环境

环境 位置 用途 配置文件
开发机 当前主机 (Windows) 编码、调试、本地运行后端 docs/connections-remote.yaml
服务器 Remote_MisakaServer:/home/misakafiles/ 生产部署 docs/connections-local.yaml

配置文件说明:

  • connections-remote.yaml — 当前主机开发时使用,通过公网域名/cpolar 隧道连接服务器上的 MinIO 和 PostgreSQL
  • connections-local.yaml — 服务器部署时使用MinIO 和 PostgreSQL 均为 localhost 连接
  • 两个文件均已在 .gitignore 中,不提交到仓库

Part A: 后端 (backend/)

A1. 项目初始化

  • 创建 pyproject.toml 管理依赖
  • 依赖清单:fastapi, uvicorn[standard], boto3 (S3), psycopg[binary] (PostgreSQL), python-multipart, pydantic, pyyaml
  • 创建 config.example.yaml 声明配置模板
  • 创建 .gitignore

A2. 项目结构

backend/
├── app/
│   ├── __init__.py
│   ├── main.py            # FastAPI app 入口
│   ├── config.py           # Settings (Pydantic, 读 config.yaml)
│   ├── routers/
│   │   │   └── upload.py   # POST /api/upload 路由
│   ├── services/
│   │   ├── minio.py        # MinIO 上传逻辑
│   │   └── database.py     # PostgreSQL 写入逻辑
│   └── models/
│       └── transaction.py  # Pydantic / SQL 模型
├── config.example.yaml     # 配置模板 (无敏感信息)
├── pyproject.toml
├── Dockerfile
├── docker-compose.yml
└── .gitignore

A3. 核心功能实现

功能 说明
config.py 使用 Pydantic 模型读取 config.yamlMinIO 连接、PG 连接、API Token
POST /api/upload 接收 multipart/form-data图片文件 + original_filename + user_note鉴权 Token 校验
services/minio.py 生成 Object Key (YYYY/MM/DD/<uuid>.<ext>),调用 S3 PutObject 上传到 snapledger
services/database.py 写入 transactionsimage_object_key, original_filename, user_note, upload_time, process_status=PENDING

A4. 本地开发验证

  • docs/connections-remote.yaml 复制为 backend/config.yaml
  • 在当前主机上使用 .venv 运行 FastAPI
  • curl -X POST 模拟上传,确认 MinIO 有文件、PG 有记录

A5. 服务器部署

  1. SSH 到 Remote_MisakaServer
  2. cd /home/misakafiles/ && git clone <主仓库地址> && cd SnapLedger && git submodule update --init
  3. docs/connections-local.yaml 复制为 backend/config.yaml
  4. cd backend && docker compose up -d --build
  5. 验证容器运行正常,从 Android 端实际测试

Part B: Android 端 (android/)

B1. 项目初始化

  • flutter create 创建 Flutter 项目
  • 添加依赖:http (网络请求)、path_provider (文件路径)、shared_preferences (可选,缓存 Token)
  • 配置 AndroidManifest.xml注册 Share Intent receiver

B2. 核心功能实现

功能 说明
Share Intent 接收 Android 原生层 (MethodChannel) 注册 ACTION_SEND intent接收图片 URI 和原始文件名
记账弹窗 UI Flutter 半屏弹窗:图片缩略图预览 + 备注输入框 + 提交/取消按钮
网络上传模块 构造 multipart POST 请求,附带图片字节流 + original_filename + user_note + Token Header
失败重试 上传失败时本地缓存请求,网络恢复后重试

B3. 验证

  • 手机截图 → 分享到 SnapLedger → 弹窗 → 提交 → 确认 MinIO 和 PG 有数据

实施顺序

A1 → A2 → A3 → A4(本地验证) → A5(服务器部署) → B1 → B2 → B3
                                               ↑
                                         后端就绪后开始

先完成后端,再实现 Android 端。 后端完成后可以用 curl 验证,不依赖客户端。


产出文件清单

文件 位置 说明
后端代码 backend/app/ FastAPI 应用
Dockerfile backend/Dockerfile 后端容器镜像
docker-compose.yml backend/docker-compose.yml 后端容器编排
Flutter 项目 android/lib/ Flutter/Dart 源码
AndroidManifest android/android/app/src/main/AndroidManifest.xml Share Intent 注册