记录生活中那些擦肩而过的瞬间
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(逆地理编码)
请参考 Flutter 官方文档:https://flutter.dev/docs/get-started/install
GPS 定位功能需要高德地图 API Key:
- 前往高德开放平台注册:https://lbs.amap.com/
- 创建应用,获取"Web 服务"类型的 API Key
- 复制
lib/core/config/amap_config.dart.template为amap_config.dart - 将 API Key 填入配置文件
详细步骤请查看:高德地图集成指南
cd serendipity_app
flutter pub get# Android
flutter run
# iOS
flutter run
# Web
flutter run -d chrome由于本应用通过 APK 直接发布(未上架应用商店),安装时会遇到安全警告,这是正常现象。
前往 GitHub Releases 下载最新版本 APK。
- 下载 APK 文件
- 打开 APK 文件
- 如果提示"禁止安装未知应用":
- 点击"设置"
- 允许"来自此来源的应用"
- 返回继续安装
- 如果 Google Play 保护机制提示风险:
- 点击"更多详情"
- 点击"仍然安装"
- 本应用未上架 Google Play 或其他应用商店
- Android 系统对所有非商店来源的应用都会显示警告
- 这不代表应用本身有问题
- 本项目完全开源,代码可在 GitHub 查看
- 使用 MIT 开源许可证
- 一人独立开发,无第三方广告或追踪
自愿付费(Pay What You Want)
- 用户自定义金额:¥0-648/月
- 基础版:记录、故事线、签到与账号数据都可同步,最多3条故事线
- 会员版:无限故事线、词云图、高级主题等
MIT License
如有任何建议、意见、问题,或是想说句鼓励的话,都欢迎发邮件至: