# seeklove **Repository Path**: free1112/seeklove ## Basic Information - **Project Name**: seeklove - **Description**: SeekLove 是一个只属于两个人的私密恋爱 App,没有陌生人、没有社交、没有公开动态。功能围绕情侣日常陪伴展开:首页数据概览、回忆胶囊(定时解锁)、晚安信箱(每日问答双人解锁)、情绪记录与经期陪伴。前端用 Expo (React Native),后端用 Spring Boot + MySQL,身份认证走 JWT。 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-24 - **Last Updated**: 2026-06-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: 情侣, 大模型应用 ## README # SeekLove 只属于两个人的私密恋爱 App,基于 Expo、React Native、TypeScript 和 Spring Boot 构建。 ## 项目定位 一个情侣空间只允许两个人存在,不做社交、不做公开动态、不做多用户社区。所有功能围绕“私密、温柔、有仪式感”展开。 ## 当前能力 **已完成闭环:** - 双人账号注册、登录、情侣空间创建和邀请码加入 - 回忆胶囊创建、列表、详情与未解锁内容保护 - 首页真实概览数据聚合(一句话、倒计时、胶囊预览、今日状态) - 晚安信箱:每日问题、双人回答、双方提交后解锁、历史归档、转胶囊 - 情绪陪伴:今日心情记录、预设快捷语、双人互看(经期搭档角色) - 经期陪伴:周期档案、每日症状日志、AI 分析、智能体对话 **后端已实现、前端页面已完成但暂未挂在主导航:** - 晚安信箱独立页面(后端与页面组件均可用,可通过入口调用) **规划中:** - 媒体上传(图片、语音) - 我们的地图 - 每周情侣任务 - 桌面小组件 ## 技术栈 | 层级 | 技术 | |------|------| | 移动端 | Expo SDK 56, React Native 0.85, TypeScript 6 | | 状态管理 | React hooks + local state | | 本地存储 | expo-secure-store / localStorage | | 后端 | Java 21, Spring Boot 3.5, Spring Security, Spring Data JPA | | 数据库 | MySQL | | 测试数据库 | H2 (in-memory) | | AI | DeepSeek API | | 认证 | JWT (HMAC-SHA256) | | 构建 | EAS Build | ## 仓库结构 ``` seeklove/ ├── App.tsx # Expo 入口 ├── app.json # Expo 应用配置 ├── package.json # 前端依赖与脚本 ├── eas.json # EAS 构建配置 ├── tsconfig.json # TypeScript 配置 ├── .env.example # 环境变量示例 ├── DEVELOPMENT_PLAN.md # 开发规划 ├── src/ │ ├── SeekLoveApp.tsx # 应用主体(路由、状态协调) │ ├── api.ts # HTTP 客户端、类型定义、接口封装 │ ├── storage.ts # 安全存储封装 │ ├── theme.ts # 颜色、间距常量 │ ├── hooks/ │ │ ├── useAuth.ts # 认证状态 │ │ ├── useCouple.ts # 情侣空间状态 │ │ ├── useHome.ts # 首页数据 │ │ ├── useCapsules.ts # 回忆胶囊状态 │ │ ├── useMood.ts # 情绪陪伴状态 │ │ ├── useCycle.ts # 经期陪伴状态 │ │ └── useMailbox.ts # 晚安信箱状态 │ └── screens/ │ ├── AuthScreen.tsx # 登录/注册 │ ├── GenderSetupScreen.tsx # 身份选择 │ ├── CoupleSetupScreen.tsx # 创建/加入情侣空间 │ ├── TodayScreen.tsx # 首页 │ ├── MoodScreen.tsx # 情绪陪伴 │ ├── CapsulesScreen.tsx # 回忆胶囊 │ ├── CycleScreen.tsx # 经期陪伴 │ ├── MailboxScreen.tsx # 晚安信箱(页面组件) │ ├── TabBar.tsx # 底部导航 │ ├── screenPrimitives.tsx # 通用 UI 组件 │ └── screenUtils.ts # 工具函数 ├── server/ │ ├── pom.xml # Maven 配置 │ ├── deploy/ # 部署模板与脚本 │ ├── start-local.ps1 # 本地启动助手 │ └── src/main/java/com/seeklove/server/ │ ├── auth/ # 认证模块 │ ├── couple/ # 情侣空间模块 │ ├── capsule/ # 回忆胶囊模块 │ ├── mailbox/ # 晚安信箱模块 │ ├── mood/ # 情绪陪伴模块 │ ├── cycle/ # 经期陪伴模块 │ ├── home/ # 首页聚合模块 │ ├── meta/ # 元信息接口 │ ├── common/ # 公共工具、安全、异常 │ └── ai/ # AI 配置 └── assets/ # 图标与启动画面 ``` ## 运行环境 - Node.js >= 22.13 - npm - Java 21 - MySQL 8 - Android Studio(真机/模拟器调试)或 Expo Go App ## 快速开始 ```bash git clone cd seeklove npm install ``` ### 前端 ```bash npm start ``` 然后用 Expo Go 扫码,或运行: ```bash npm run android ``` > 首次启动前需配置后端地址,见下方“环境变量”一节。 ### 后端 ```bash cd server ./mvnw spring-boot:run ``` Windows 下使用 `mvnw.cmd` 替代 `mvnw`: ```powershell cd server .\mvnw.cmd spring-boot:run ``` ## 环境变量 ### 前端变量 在项目根目录创建 `.env.local`(不会被提交): ``` EXPO_PUBLIC_API_BASE_URL=http://your-server:8080 ``` 不创建此文件时,前端默认连接 `http://127.0.0.1:8080`。 > **不要将 `.env`、`.env.local` 或任何含真实密钥的文件提交到仓库。** ### 后端变量 后端启动时可注入以下环境变量: | 变量 | 说明 | 示例 | |------|------|------| | `SPRING_DATASOURCE_URL` | MySQL 连接串 | `jdbc:mysql://127.0.0.1:3306/seeklove?...` | | `SPRING_DATASOURCE_USERNAME` | 数据库用户 | `seeklove` | | `SPRING_DATASOURCE_PASSWORD` | 数据库密码 | `change_me` | | `JWT_SECRET` | JWT 签名密钥(覆盖 `seeklove.jwt.secret`) | 随机长字符串 | | `DEEPSEEK_API_KEY` | DeepSeek API 密钥 | `sk-...` | | `DEEPSEEK_MODEL` | DeepSeek 模型名 | `deepseek-v4-flash` | | `SERVER_PORT` | 服务端口 | `8080` | 部署环境变量模板:`server/deploy/seeklove.env.example` ### AI 启用检测 后端启动时会自动检测 AI 密钥是否可用: ```powershell cd server .\start-local.ps1 -CheckOnly ``` 日志中出现以下信息表示已接入 DeepSeek: ``` cycle-companion source=AI model=deepseek-v4-flash available=true ``` 若未配置密钥,经期分析会自动切换为规则引擎 fallback。 ## 常用命令 ### 前端 | 命令 | 说明 | |------|------| | `npm start` | 启动 Expo 开发服务器 | | `npm run android` | 连接 Android 设备/模拟器 | | `npm run ios` | 连接 iOS 设备/模拟器 | | `npm run web` | 启动 Web 版 | | `npm run build:android:apk` | 构建 APK | | `npm run build:android:preview` | 构建预览 APK | | `npm run build:android:aab` | 构建 AAB(应用商店) | ### 后端 | 命令 | 说明 | |------|------| | `./mvnw spring-boot:run` | 启动后端(macOS/Linux) | | `.\mvnw.cmd spring-boot:run` | 启动后端(Windows) | | `.\mvnw.cmd test` | 运行测试(Windows) | | `./mvnw test` | 运行测试(macOS/Linux) | 测试默认使用 H2 内存数据库,无需 MySQL。 ## API 概览 ### 公开接口(无需认证) - `POST /api/v1/auth/register` - `POST /api/v1/auth/login` - `GET /api/v1/meta/overview` - `GET /actuator/health` ### 需要认证(Bearer Token) **认证** - `GET /api/v1/auth/me` - `PUT /api/v1/auth/me/gender` **情侣空间** - `POST /api/v1/couples` - `POST /api/v1/couples/join` - `GET /api/v1/couples/me` **首页** - `GET /api/v1/home/overview` **回忆胶囊** - `GET /api/v1/capsules` - `GET /api/v1/capsules/{capsuleId}` - `POST /api/v1/capsules` **晚安信箱** - `GET /api/v1/mailbox/today` - `POST /api/v1/mailbox/today/answer` - `GET /api/v1/mailbox/history` - `POST /api/v1/mailbox/history/{sessionId}/capsule` **情绪陪伴** - `GET /api/v1/mood/me` - `GET /api/v1/mood/partner-view` - `GET /api/v1/mood/overview` - `POST /api/v1/mood/presets` **经期陪伴** - `GET /api/v1/cycle/me` - `POST /api/v1/cycle/me/logs` - `GET /api/v1/cycle/me/history` - `GET /api/v1/cycle/me/analysis` - `POST /api/v1/cycle/companion/reply` - `GET /api/v1/cycle/partner-view` - `GET /api/v1/cycle/overview` ### 返回格式 ``` { "message": "ok", "data": { ... } } ``` 错误时返回: ``` { "message": "错误描述", "errors": { "field": "提示" } } ``` ## 构建与打包 1. 确保 `eas.json` 中配置了正确的 profile 2. 确保已登录 Expo 账号:`npx eas login` 3. 选择对应命令构建: ```bash npm run build:android:apk # APK npm run build:android:preview # 预览 APK npm run build:android:aab # 应用商店 AAB ``` ## 部署 ### 部署模板 仓库提供以下模板文件(均为示例,不含真实密钥): - `server/deploy/seeklove.env.example` - 环境变量模板 - `server/deploy/seeklove.service.example` - Linux systemd 服务模板 - `server/deploy/nginx.seeklove.conf.example` - Nginx 反向代理模板 - `server/deploy/windows/start-seeklove.ps1.example` - Windows 启动脚本 - `server/deploy/windows/register-seeklove-task.ps1.example` - Windows 计划任务 - `server/deploy/windows/remove-old-project.ps1.example` - 旧项目清理脚本 - `server/deploy/windows/deploy-remote.ps1` - Windows Server 远程部署脚本 ### Linux 最小部署步骤 1. 将 `server/target/*.jar` 上传到服务器 2. 复制环境变量模板并填写真实值 3. 配置 systemd 服务 4. 启动并验证健康检查 ### Windows Server 版本 使用 `deploy-remote.ps1` 可一键完成远程部署(生成随机数据库密码和 JWT 密钥、配置防火墙、注册开机自启)。 ## 安全约定 - **`.env`、`*.env`、`.env.*` 文件已加入 `.gitignore`,不会进入仓库** - 仓库中所有 `.env.example` 文件仅包含占位值(`change_me`、`your-server` 等) - 部署脚本自动生成随机密码和密钥,不在仓库中存储任何真实凭证 - 生产环境中务必替换 `application.yml` 中的开发默认值 - 前端 token 通过 `expo-secure-store` 安全存储 ## 文档与规划 - [开发规划](./DEVELOPMENT_PLAN.md) - [后端数据模型设计](./server/BACKEND_SCHEMA.md) - [后端 README](./server/README.md)