旅行足迹App技术架构全解析

旅行足迹移动应用技术架构文档

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
email 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');
相关推荐
步步为营DotNet几秒前
探究.NET 11 中 Semantic Kernel 在 AI 驱动后端开发的前沿应用
人工智能·.net
帐篷Li几秒前
【Vibe Coding】一口气搞懂AI黑话:Vibe Coding、Agent、提示词、MCP、Skills全解析
人工智能·microsoft
星辰徐哥几秒前
云边端一体化解析:什么是云边端,为何能成为AI基础设施核心
人工智能·ai·云边端
拉什福德Rashford1 分钟前
一个人就是一支影视团队:实测国内最强影视级 AI 视频创作平台 TapNow——告别抽卡,导演级精准控制
人工智能·科技·ai作画·aigc·音视频·产品经理
搜狐技术产品小编20233 分钟前
AI Rules
人工智能
2501_948114243 分钟前
Muse Spark 闭源转型背后的系统化演进:PAO 架构、KV Cache 压缩与聚合接入实践
大数据·架构·spark
昨夜见军贴06163 分钟前
IA-Lab AI 检测报告生成助手:土壤重金属检测报告如何实现GB 15618标准自动解析,推动降本与合规双升级?
大数据·人工智能
OpenVINO 中文社区4 分钟前
4.13直播 | 端侧多模态模型应用开发Skill实战
人工智能
前端摸鱼匠4 分钟前
【AI大模型春招面试题17】 过拟合、欠拟合在大模型中的表现与解决策略?
人工智能·ai·语言模型·面试·大模型
Coovally AI模型快速验证4 分钟前
建筑外立面多类缺陷自动巡检系统:无人机采集+AI分割+自动报告,剥落检测Recall达98%
人工智能·无人机·机器视觉·工业检测·建筑检测