旅行足迹移动应用技术架构文档
1. Architecture design
外部服务 数据层 后端层 前端层 AI服务API 音乐服务API Supabase数据库 云存储服务 后端服务 React Native应用 百度地图SDK 设备原生API 移动端用户
2. Technology Description
-
前端: React Native@0.72 + TypeScript + React Navigation@6 + React Native Maps + Lottie React Native
-
后端: Node.js + Express.js + TypeScript
-
数据库: Supabase (PostgreSQL)
-
云存储: Supabase Storage
-
地图服务: 百度地图React Native SDK
-
AI服务: OpenAI API / 百度文心一言API
-
音乐服务: 网易云音乐API / QQ音乐API
-
动画: Lottie + React Native Reanimated
-
状态管理: Redux Toolkit + RTK Query
-
本地存储: AsyncStorage + MMKV
3. Route definitions
Route | Purpose |
---|---|
/home | 首页,显示地图概览和快捷操作入口 |
/map | 地图页面,百度地图集成和足迹标记功能 |
/media | 多媒体页面,拍照录像和云存储管理 |
/media/camera | 相机页面,拍照和录像功能 |
/media/video/:id | 短视频播放页面,类抖音播放体验 |
/music | 音乐播放页面,播放器和播放列表管理 |
/music/playlist/:id | 播放列表详情页面 |
/chat | AI对话页面,聊天和情绪分析功能 |
/game | 游戏页面,目的地抽奖和动画效果 |
/profile | 个人中心,用户信息和设置选项 |
/profile/settings | 设置页面,应用配置和隐私设置 |
/auth/login | 登录页面,用户身份验证 |
/auth/register | 注册页面,新用户注册 |
4. API definitions
4.1 Core API
用户认证相关
POST /api/auth/login
Request:
Param Name | Param Type | isRequired | Description |
---|---|---|---|
string | true | 用户邮箱 | |
password | string | true | 用户密码 |
Response:
Param Name | Param Type | Description |
---|---|---|
success | boolean | 登录是否成功 |
token | string | JWT访问令牌 |
user | object | 用户基本信息 |
足迹管理相关
GET /api/footprints
POST /api/footprints
PUT /api/footprints/:id
DELETE /api/footprints/:id
多媒体文件相关
POST /api/media/upload
GET /api/media/:id
DELETE /api/media/:id
AI对话相关
POST /api/chat/message
GET /api/chat/history
POST /api/chat/analyze-emotion
游戏相关
POST /api/game/lottery
GET /api/game/destinations
5. Server architecture diagram
外部服务 服务端 百度地图服务 AI服务 音乐服务 云存储服务 API网关层 认证中间件 控制器层 服务层 数据访问层 React Native客户端 Supabase数据库
6. Data model
6.1 Data model definition
USERS uuid id PK string email string password_hash string nickname string avatar_url string phone enum user_type timestamp created_at timestamp updated_at FOOTPRINTS uuid id PK uuid user_id FK string title text description decimal latitude decimal longitude string address timestamp visit_time timestamp created_at timestamp updated_at MEDIA_FILES uuid id PK uuid user_id FK uuid footprint_id FK string file_name string file_url string file_type integer file_size decimal latitude decimal longitude timestamp created_at CHAT_MESSAGES uuid id PK uuid user_id FK text message string message_type json emotion_analysis timestamp created_at PLAYLISTS uuid id PK uuid user_id FK string name string description string cover_url timestamp created_at timestamp updated_at PLAYLIST_SONGS uuid id PK uuid playlist_id FK string song_id string song_name string artist string album string cover_url integer duration integer sort_order timestamp added_at creates uploads sends creates contains includes
6.2 Data Definition Language
用户表 (users)
sql
-- 创建用户表
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
nickname VARCHAR(100) NOT NULL,
avatar_url TEXT,
phone VARCHAR(20),
user_type VARCHAR(20) DEFAULT 'normal' CHECK (user_type IN ('normal', 'premium', 'admin')),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 创建索引
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_created_at ON users(created_at DESC);
-- 设置权限
GRANT SELECT ON users TO anon;
GRANT ALL PRIVILEGES ON users TO authenticated;
足迹表 (footprints)
sql
-- 创建足迹表
CREATE TABLE footprints (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL,
title VARCHAR(200) NOT NULL,
description TEXT,
latitude DECIMAL(10, 8) NOT NULL,
longitude DECIMAL(11, 8) NOT NULL,
address TEXT,
visit_time TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 创建索引
CREATE INDEX idx_footprints_user_id ON footprints(user_id);
CREATE INDEX idx_footprints_location ON footprints(latitude, longitude);
CREATE INDEX idx_footprints_visit_time ON footprints(visit_time DESC);
-- 设置权限
GRANT SELECT ON footprints TO anon;
GRANT ALL PRIVILEGES ON footprints TO authenticated;
多媒体文件表 (media_files)
sql
-- 创建多媒体文件表
CREATE TABLE media_files (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL,
footprint_id UUID,
file_name VARCHAR(255) NOT NULL,
file_url TEXT NOT NULL,
file_type VARCHAR(50) NOT NULL CHECK (file_type IN ('image', 'video', 'audio')),
file_size INTEGER,
latitude DECIMAL(10, 8),
longitude DECIMAL(11, 8),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 创建索引
CREATE INDEX idx_media_files_user_id ON media_files(user_id);
CREATE INDEX idx_media_files_footprint_id ON media_files(footprint_id);
CREATE INDEX idx_media_files_type ON media_files(file_type);
-- 设置权限
GRANT SELECT ON media_files TO anon;
GRANT ALL PRIVILEGES ON media_files TO authenticated;
聊天消息表 (chat_messages)
sql
-- 创建聊天消息表
CREATE TABLE chat_messages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL,
message TEXT NOT NULL,
message_type VARCHAR(20) DEFAULT 'user' CHECK (message_type IN ('user', 'ai')),
emotion_analysis JSONB,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 创建索引
CREATE INDEX idx_chat_messages_user_id ON chat_messages(user_id);
CREATE INDEX idx_chat_messages_created_at ON chat_messages(created_at DESC);
-- 设置权限
GRANT SELECT ON chat_messages TO anon;
GRANT ALL PRIVILEGES ON chat_messages TO authenticated;
播放列表表 (playlists)
sql
-- 创建播放列表表
CREATE TABLE playlists (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL,
name VARCHAR(100) NOT NULL,
description TEXT,
cover_url TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 创建播放列表歌曲表
CREATE TABLE playlist_songs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
playlist_id UUID NOT NULL,
song_id VARCHAR(100) NOT NULL,
song_name VARCHAR(200) NOT NULL,
artist VARCHAR(200),
album VARCHAR(200),
cover_url TEXT,
duration INTEGER,
sort_order INTEGER DEFAULT 0,
added_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 创建索引
CREATE INDEX idx_playlists_user_id ON playlists(user_id);
CREATE INDEX idx_playlist_songs_playlist_id ON playlist_songs(playlist_id);
CREATE INDEX idx_playlist_songs_sort_order ON playlist_songs(playlist_id, sort_order);
-- 设置权限
GRANT SELECT ON playlists TO anon;
GRANT ALL PRIVILEGES ON playlists TO authenticated;
GRANT SELECT ON playlist_songs TO anon;
GRANT ALL PRIVILEGES ON playlist_songs TO authenticated;
初始化数据
sql
-- 插入测试用户
INSERT INTO users (email, password_hash, nickname, user_type) VALUES
('test@example.com', '$2b$10$example_hash', '测试用户', 'normal'),
('admin@example.com', '$2b$10$example_hash', '管理员', 'admin');
-- 插入示例足迹
INSERT INTO footprints (user_id, title, description, latitude, longitude, address, visit_time) VALUES
((SELECT id FROM users WHERE email = 'test@example.com'), '天安门广场', '北京的心脏地带', 39.9042, 116.4074, '北京市东城区天安门广场', NOW() - INTERVAL '7 days');