Skip to content

Repository files navigation

Folks 身边人

一款主打 纯本地、极致隐私、即用即走 的个人社交关系与人情往来管理工具。 帮你记住身边的亲戚朋友、理清人情账目、留住共同回忆。

  • 技术选型:Flutter + 本地 SQLite(核心业务完全离线可用)
  • 首发平台:Android(后续兼容 iOS)
  • 数据原则:所有数据持久化在本地,不上云、0 服务器成本

数据模型(架构基线)

家族与圈子共用同一套底层数据,只是展示方式不同:

  • person:统一的人物表(亲戚 / 朋友 / 同事都是 person)。group 字段决定在「家族」里以树状呈现、还是在「圈子」里以平面 + 标签呈现
    • 家族结构关系(父/母/配偶)内嵌为 person 上的 ID 字段(血缘是固定基数,无需独立关系表)
    • 圈子关系不建人与人的边,只用 tags 聚类
    • ⚠️ 设计前瞻(避免未来 migration):血亲/婚姻 v1 用内嵌 ID 即可;但非血缘关系(干亲/义亲、师徒、同学同事等社会关系)与重组家庭(继/养父母)将来要靠一张 typed relationship 边表from_id / to_id / type / 备注)。落地 SQLite 时就把这张边表建好(v1 可只承载少量类型,甚至与内嵌 ID 并存),这样以后加"干爹"等新类型只是插入新行(additive),不必在用户设备上做破坏性 schema 迁移。非血缘关系在详情页以列表呈现,不进家族树(树只画血亲+婚姻,保持布局干净)
  • event:回忆 / 人情往来记录,可绑定多个 person

好处:朋友的「家属」和家族成员可互通,回忆能跨 Tab 绑定人,差额清算统一处理。


TODO

排期原则:先验证「用户愿不愿意持续录入和回看」,再接广告。 录入门槛 + 提醒缺失是 MVP 最大的体验风险,P0 优先解决。

P0 — MVP 核心(验证核心价值)

  • 统一数据层person / relationship / event 三张表 + DAO
  • 引导式录入:以"我"为根节点,「加父亲 / 加孩子 / 加配偶」自动反推对方关系
    • 配偶关系双向自动设置
    • 删除成员时的引用处理策略(级联删 vs 置空,需明确定义)
  • 家族 Tab:树状级联视图(缩放 / 折叠 / 点击进详情)
  • 圈子 Tab:平面列表 + 多标签聚合(一人可打多个标签)
    • 朋友卡片的扁平「家属随行」字段
    • 借鉴通讯录的补充字段:公司 / 职位读音(拼音)纪念日
  • 成员详情页:基础字段(真实姓名 / 小名 / 性别 / 生日 / 自定义称呼 / Markdown 备注)
  • 回忆 Tab(人情时光机)
    • 三类事件:💰 物质往来 / 🚗 共同经历 / 🎯 重要里程碑
    • 一条记录可同时绑定多个 person,并自动分发到各自的时光轴
    • 差额自动清算面板("净人情往来:逆差 X 元")
  • 本地提醒/通知:生日、纪念日、里程碑提醒(留存命脉,纯本地实现)
  • 搜索:按姓名 / 小名 / 标签 / 拼音 检索
  • App 锁:指纹 / PIN(与"极致隐私"定位强绑定)
  • 照片:选图后复制副本到 App 私有目录(避免相册清理/换机断链)
    • 存储前压缩(控制体积)

P1 — 增强体验

  • 称呼反向解析(半自动):详情页提示"你该叫 TA / TA 该叫你"
    • 先覆盖三代以内常见关系,允许用户手动覆盖纠正(中文称谓极复杂,纯算法易错)
    • 称谓库地区/学制以内地为基准(首发目标用户)
  • typed 关系边表 / 非血缘关系(含干亲义亲、师徒、社会关系 + 重组家庭;较重,暂缓):
    • 当前"一父一母一配偶"的内嵌槽表达不了"生父+继父"并存,也表达不了干爹 / 师傅等非血缘关系
    • 方案:统一用 relationship(from_id, to_id, type, note) 边表承载;血亲婚姻可继续内嵌或并入边表,称呼计算相应扩展
    • 边表在 SQLite 首版就预留(见「数据模型 · 设计前瞻」),先做血缘、后加干亲都只插行不迁移
    • UI:血亲婚姻保留快捷按钮 + 进树;"其他关系"走详情页通用入口(选类型→选/建人)+ 列表呈现,不进树
  • 通讯录互通(vCard):与系统通讯录 / .vcf 文件双向打通
    • 导入种子(降录入门槛):从系统通讯录或 .vcf 导入姓名/电话/生日/公司/标签/备注
    • 导出回填:选择性把成员的名片字段导出为 .vcf,可写回手机通讯录(勾选人/字段,避免污染通讯录)
    • 全程一次性本地操作,不做持续同步、不上传(契合"极致隐私")
    • 仅覆盖名片类字段;人情账 / 回忆时光轴 / 家族树走 JSON 全量备份,不进 vCard
    • 为回填可用,person 增加可选 phone / email(单值从简,不做标签多值)
    • 电话非唯一键:多人可共用同一号码,导入时不按号码去重(主键始终是 id
    • 导入按有损处理(地址/多电话/网址等未建模字段丢弃,不做原始 vCard 透传)
    • 实现:flutter_contacts 读写联系人 + .vcf 解析/生成;处理 Android 通讯录权限
  • 生日部分精度:支持只填「年」或「年+月」(长辈常只知大概)。年→算年龄、不进生日提醒;完整→才进提醒。公历优先
  • 农历生日(单列,较重):农历↔公历转换,长辈生日常用农历;与部分精度独立设计
  • 自动本地备份:定期生成全量 JSON 备份 + 到期提醒
  • 备份导入/恢复:换机迁移(含照片副本一并打包)
  • 时光轴富文本 / 多图浏览体验优化

P2 — 商业化与外围

  • AdMob 变现方案(待重新评估,先克制,避免伤调性 / 过审风险)
    • 倾向:自愿打赏去广告 + 激励视频解锁高级功能为主,慎用开屏/信息流
    • AdMob Mediation 接入 Pangle(内地流量补充)
  • 数据导出:CSV / Excel(家族 / 圈子 / 回忆三表),HTML 家谱报告
  • 上架合规
    • 隐私政策 + Play Console Data Safety 表
    • 应用年龄分级定为成人向(避免被归类为儿童应用)
    • 广告 SDK 同意弹窗(UMP)
  • Android 媒体权限适配(13+ READ_MEDIA_IMAGES
  • iOS 端兼容

About

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages