一个二维码失物招领平台。用户将二维码贴在自己的物品上,当物品丢失后,拾到者扫描二维码即可通过平台联系物主,无需直接暴露物主的手机号等隐私信息。
- 二维码管理:创建、编辑、启用/停用物品二维码
- 扫码留言:拾到者扫描二维码,填写留言联系物主
- 隐私保护:物主与拾到者之间通过平台匿名沟通,不直接暴露手机号
- 多平台支持:iOS、Android、Web H5、微信小程序
- 框架:NestJS 10 + TypeScript
- 数据库:PostgreSQL 16 + Prisma 5
- 缓存/会话:Redis 7 (ioredis)
- 认证:JWT + Refresh Token
- API 文档:Swagger
- 框架:uni-app 5.08 + Vue 3 + TypeScript
- 状态管理:Pinia 2
- 构建工具:Vite 4
lost_and_find/
├── backend/ # NestJS 后端
│ ├── prisma/
│ │ └── schema.prisma # 数据库 Schema
│ └── src/
│ ├── auth/ # 手机号 OTP 登录、JWT 签发
│ ├── users/ # 用户资料 CRUD
│ ├── qrcodes/ # 二维码生命周期管理
│ ├── scan/ # 扫码公开接口
│ └── messages/ # 物主查看拾到者留言
├── frontend/ # uni-app 前端
│ └── src/
│ ├── pages/ # 页面组件
│ ├── stores/ # Pinia 状态管理
│ └── api/ # API 请求封装
└── CLAUDE.md # 项目上下文文档
- Node.js 20 LTS
- Docker Desktop
cd backend
# 复制环境变量
cp .env.example .env
# 启动数据库 + Redis
docker compose up -d
# 安装依赖
npm install
# 生成 Prisma Client 并建表
npx prisma migrate dev --name init
# 启动开发服务器
npm run start:dev
cd frontend
# 安装依赖
npm install --legacy-peer-deps
# 启动 H5 开发服务器
npm run dev:h5
| 方法 |
路径 |
说明 |
| POST |
/auth/send-code |
发送手机验证码 |
| POST |
/auth/verify-code |
验证码登录/注册 |
| POST |
/auth/refresh |
刷新 Access Token |
| POST |
/auth/logout |
注销登录 |
| 方法 |
路径 |
说明 |
| POST |
/qrcodes |
创建二维码 |
| GET |
/qrcodes |
获取二维码列表 |
| GET |
/qrcodes/:id |
获取二维码详情 |
| PATCH |
/qrcodes/:id |
更新二维码 |
| DELETE |
/qrcodes/:id |
删除二维码 |
| PATCH |
/qrcodes/:id/toggle |
启用/停用切换 |
| 方法 |
路径 |
说明 |
| GET |
/scan/:token |
获取物品信息 |
| POST |
/scan/:token/message |
发送留言 |
| 方法 |
路径 |
说明 |
| GET |
/messages |
获取留言列表 |
| GET |
/messages/unread-count |
未读留言数 |
| PATCH |
/messages/:id/read |
标记已读 |
| 字段 |
类型 |
说明 |
| id |
uuid |
主键 |
| phone |
varchar |
手机号(唯一) |
| nickname |
varchar |
昵称 |
| avatarUrl |
varchar |
头像 URL |
| createdAt |
datetime |
创建时间 |
| updatedAt |
datetime |
更新时间 |
| 字段 |
类型 |
说明 |
| id |
uuid |
主键 |
| userId |
uuid |
物主 ID |
| token |
varchar |
二维码 Token(唯一) |
| label |
varchar |
物品名称 |
| description |
varchar |
物品描述 |
| icon |
varchar |
Emoji 图标 |
| color |
varchar |
主题颜色 |
| isActive |
bool |
是否启用 |
| scanCount |
int |
扫码次数 |
| 字段 |
类型 |
说明 |
| id |
uuid |
主键 |
| qrCodeId |
uuid |
二维码 ID |
| finderName |
varchar |
拾到者姓名 |
| finderContact |
varchar |
联系方式 |
| message |
varchar |
留言内容 |
| isRead |
bool |
是否已读 |
| 变量 |
说明 |
默认值 |
| PORT |
服务端口 |
3000 |
| DATABASE_URL |
PostgreSQL 连接串 |
postgresql://postgres:postgres@localhost:5432/lost_and_find |
| REDIS_HOST |
Redis 主机 |
localhost |
| REDIS_PORT |
Redis 端口 |
6379 |
| JWT_SECRET |
JWT 密钥 |
- |
| FRONTEND_URL |
前端地址 |
http://localhost:5173 |
curl -X POST http://localhost:3000/api/v1/auth/send-code \
-H "Content-Type: application/json" \
-d '{"phone":"13800138000"}'
curl -X POST http://localhost:3000/api/v1/auth/verify-code \
-H "Content-Type: application/json" \
-d '{"phone":"13800138000","code":"123456"}'
MIT