Skip to content

Repository files navigation

Serendipity(错过了么)

记录生活中那些擦肩而过的瞬间

📋 项目简介

Serendipity 是一个情感记录类移动应用,专注于记录日常生活中错过的人。

无论是通勤路上的地铁、公交,还是周末的咖啡馆、公园,那些让你心动却未曾开口的瞬间,都值得被记住。

  • 核心理念:有些错过,只能被记住
  • 目标用户:18-35岁,经常通勤的都市青年
  • 平台:Android 5.0+(直接发布 APK)

⬇️ 下载

本应用当前仅提供 Android APK 直接安装版本,未上架应用商店。

📁 项目结构

Serendipity/
├── README.md                    # 项目总说明(本文件)
├── docs/                        # 项目文档、重构计划与评审记录
│   ├── Serendipity_Spec.md      # 完整规格文档
│   ├── 开发清单_00_总览.md       # 当前开发清单总览
│   └── code_review_reports/     # 代码评审报告
├── serendipity_app/             # Flutter 客户端
│   ├── lib/                     # 客户端源码
│   ├── assets/                  # 静态资源
│   ├── test/                    # 客户端测试
│   ├── android/                 # Android 工程
│   ├── ios/                     # iOS 工程
│   └── pubspec.yaml             # Flutter 依赖配置
├── serendipity_server/          # Node.js / Express / TypeScript 服务端
│   ├── src/                     # 服务端源码
│   ├── prisma/                  # 数据库 schema、seed 与迁移
│   ├── tests/                   # 服务端测试
│   ├── docs/                    # 服务端专项文档
│   └── package.json             # 服务端依赖与脚本
├── serendipity_web/             # Next.js 官网与下载落地页
│   ├── app/                     # App Router 页面入口与路由
│   ├── components/              # 官网组件
│   ├── config/                  # 站点配置
│   ├── content/                 # 官网文案内容
│   ├── public/                  # 官网静态资源与界面截图
│   ├── styles/                  # 设计 token 与样式补充
│   └── package.json             # 官网依赖与脚本
├── logs/                        # 根目录日志
├── project_stats.py             # 项目规模统计脚本
└── count_lines.ps1              # 行数统计脚本

📊 项目规模

文件统计

  • 总文件数:776 个
    • Dart文件:341 个
    • TypeScript文件:147 个
    • Markdown文档:118 个
    • 其他文件:38 个
    • JavaScript文件:21 个
    • Source Map文件:18 个
    • JSON文件:15 个
    • SQL脚本:12 个
    • CSS文件:10 个
    • XML文件:8 个
    • C文件:7 个
    • C++文件:6 个
    • Swift文件:6 个
    • 文本文件:6 个
    • INI/配置文件:5 个
    • Kotlin文件:4 个
    • YAML文件:3 个
    • CMake构建脚本:2 个
    • HTML文件:1 个
    • Java文件:1 个
    • License文件:1 个
    • Objective-C文件:1 个
    • PowerShell脚本:1 个
    • Prisma Schema文件:1 个
    • Python脚本:1 个
    • TOML文件:1 个
    • 批处理脚本:1 个

代码规模

  • 代码总行数:100,977 行(不含空行、注释)

    • Dart:48,194 行(47.7%)
    • JSON:32,970 行(32.6%)
    • TypeScript:13,922 行(13.8%)
    • JavaScript:3,348 行(3.3%)
    • CSS:898 行(0.9%)
    • C++:442 行(0.4%)
    • SQL:300 行(0.3%)
    • Kotlin:162 行(0.2%)
    • C:105 行(0.1%)
    • XML:103 行(0.1%)
    • ObjC:83 行(0.1%)
    • Java:81 行(0.1%)
    • YAML:76 行(0.1%)
    • Swift:75 行(0.1%)
    • PowerShell:70 行(0.1%)
    • Batch:64 行(0.1%)
    • INI:46 行(0.0%)
    • HTML:19 行(0.0%)
    • Python:18 行(0.0%)
    • TOML:1 行(0.0%)
  • 字符总数:3,373,401 字符(不含注释)

    • Dart:1,585,977 字符(47.0%)
    • JSON:853,215 字符(25.3%)
    • TypeScript:460,570 字符(13.7%)
    • JavaScript:391,216 字符(11.6%)
    • CSS:17,733 字符(0.5%)
    • C++:15,306 字符(0.5%)
    • SQL:17,047 字符(0.5%)
    • Kotlin:5,438 字符(0.2%)
    • C:3,231 字符(0.1%)
    • XML:4,922 字符(0.1%)
    • ObjC:3,462 字符(0.1%)
    • Java:4,063 字符(0.1%)
    • YAML:1,659 字符(0.0%)
    • Swift:2,684 字符(0.1%)
    • PowerShell:1,922 字符(0.1%)
    • Batch:2,107 字符(0.1%)
    • INI:1,419 字符(0.0%)
    • HTML:657 字符(0.0%)
    • Python:750 字符(0.0%)
    • TOML:23 字符(0.0%)

💡 数据来源:以上数据基于项目内的 project_stats.py 统计生成

📊 统计工具 GitHub 仓库链接Omni-Project-Stats —— 90%项目通用,涵盖多个领域

🎯 核心功能

七种状态

  • 🌫️ 错过 - 第一次看到,但没说话
  • 🙈 回避 - 看到了,但刻意避开
  • 🌟 再遇 - 又看到了,但还是没说话
  • 💫 邂逅 - 终于说话了
  • 💝 重逢 - 分开后再次相遇(需先别离)
  • 🥀 别离 - 主动结束了
  • 🍂 失联 - 被动消失,再也没见过

主要功能

  • ✅ 记录错过的瞬间
  • ✅ 故事线(关联同一个人的多次记录)
  • ✅ 时间轴浏览
  • ✅ 定位辅助与地点信息记录
  • ✅ 社区(树洞)
  • ✅ 成就系统
  • ✅ 会员系统(自愿付费 ¥0-648/月)
  • ✅ 账号系统与数据同步
  • ✅ 签到提醒

📚 文档说明

完整的项目规格文档,包含:

  • 项目概述
  • 核心功能详细设计
  • 数据模型
  • UI/UX 设计原则
  • 技术架构

当前开发清单总览,包含:

  • 项目进度追踪
  • 功能模块清单
  • 待办事项

服务端 API 设计文档,包含:

  • RESTful API 接口规范
  • 认证与鉴权机制
  • 数据模型与响应格式

🔧 技术栈

前端

  • Flutter 3.x + Dart 3.x(SDK ^3.10.8
  • Riverpod 2.x(状态管理,flutter_riverpod: ^2.6.1
  • Hive 2.x(本地存储,TypeAdapter 模式,含代码生成)
  • Geolocator(GPS 定位)
  • HTTP(网络请求,用于高德地图 API)
  • Firebase(推送通知,firebase_core + firebase_messaging
  • flutter_local_notifications(本地通知)
  • connectivity_plus(网络状态监听)
  • fl_chart(统计图表)
  • confetti(成就解锁粒子特效)
  • photo_manager + image_cropper(头像选择与裁剪)
  • 架构模式:Feature-first + Repository Pattern + Provider Pattern

后端

  • Node.js 20 LTS(运行环境)
  • Express 5.x + TypeScript 5.x
  • PostgreSQL 15 + Prisma ORM(v7.x)
  • JWT(Access Token + Refresh Token,双 Token 机制)
  • helmet、cors、express-rate-limit(安全中间件)
  • winston(日志)
  • Jest + Supertest + jest-mock-extended(测试)
  • 自实现 DI Container(依赖注入)

第三方服务

  • 高德地图 API(逆地理编码)

🛠️ 开发环境配置

1. 安装 Flutter

请参考 Flutter 官方文档:https://flutter.dev/docs/get-started/install

2. 配置高德地图 API

GPS 定位功能需要高德地图 API Key:

  1. 前往高德开放平台注册:https://lbs.amap.com/
  2. 创建应用,获取"Web 服务"类型的 API Key
  3. 复制 lib/core/config/amap_config.dart.templateamap_config.dart
  4. 将 API Key 填入配置文件

详细步骤请查看:高德地图集成指南

3. 安装依赖

cd serendipity_app
flutter pub get

4. 运行项目

# Android
flutter run

# iOS
flutter run

# Web
flutter run -d chrome

📦 安装说明

由于本应用通过 APK 直接发布(未上架应用商店),安装时会遇到安全警告,这是正常现象。

下载地址

前往 GitHub Releases 下载最新版本 APK。

安装步骤

  1. 下载 APK 文件
  2. 打开 APK 文件
  3. 如果提示"禁止安装未知应用":
    • 点击"设置"
    • 允许"来自此来源的应用"
    • 返回继续安装
  4. 如果 Google Play 保护机制提示风险:
    • 点击"更多详情"
    • 点击"仍然安装"

为什么会有安全警告?

  • 本应用未上架 Google Play 或其他应用商店
  • Android 系统对所有非商店来源的应用都会显示警告
  • 这不代表应用本身有问题

如何确认安全性?

  • 本项目完全开源,代码可在 GitHub 查看
  • 使用 MIT 开源许可证
  • 一人独立开发,无第三方广告或追踪

💎 商业模式

自愿付费(Pay What You Want)

  • 用户自定义金额:¥0-648/月
  • 基础版:记录、故事线、签到与账号数据都可同步,最多3条故事线
  • 会员版:无限故事线、词云图、高级主题等

📄 许可证

MIT License

📧 联系方式

如有任何建议、意见、问题,或是想说句鼓励的话,都欢迎发邮件至:

hatsusumi-moe@163.com


Releases

Packages

Contributors

Languages