Trip Footprint_旅行分享功能模块技术架构天气模块技术架构
1. 架构设计
2. 技术描述
-
前端: React@18 + TypeScript + TailwindCSS + Vite
-
后端: Express@4 + TypeScript + Multer + Sharp
-
数据库: Supabase (PostgreSQL)
-
缓存: Redis@7
-
文件存储: Supabase Storage + CDN
-
实时通信: WebSocket (Socket.io)
3. 路由定义
路由 | 用途 |
---|---|
/share | 分享广场页面,展示瀑布流内容 |
/share/publish | 内容发布页面,支持多媒体上传和编辑 |
/share/profile/:userId | 用户个人主页,展示用户发布的内容 |
/share/detail/:postId | 内容详情页面,显示完整内容和评论 |
/share/search | 搜索发现页面,内容搜索和分类筛选 |
/share/following | 关注用户内容页面 |
4. API定义
4.1 内容管理API
发布内容
POST /api/posts
请求参数:
参数名 | 参数类型 | 是否必需 | 描述 |
---|---|---|---|
content | string | true | 内容描述文本 |
media_files | File[] | true | 上传的图片或视频文件 |
location | object | false | 位置信息 {name, latitude, longitude} |
tags | string[] | false | 话题标签数组 |
visibility | string | false | 可见性设置 (public/private/friends) |
响应:
参数名 | 参数类型 | 描述 |
---|---|---|
success | boolean | 操作是否成功 |
post_id | string | 创建的内容ID |
message | string | 响应消息 |
示例:
{"content": "美丽的日落时分","media_files": ["file1.jpg", "file2.mp4"],"location": {"name": "三亚海滩","latitude": 18.2533,"longitude": 109.5061},"tags": ["日落", "海滩", "三亚"]
}
获取内容列表
GET /api/posts
请求参数:
参数名 | 参数类型 | 是否必需 | 描述 |
---|---|---|---|
page | number | false | 页码,默认1 |
limit | number | false | 每页数量,默认20 |
type | string | false | 内容类型 (discover/following) |
user_id | string | false | 指定用户ID |
内容互动API
POST /api/posts/:postId/like
DELETE /api/posts/:postId/like
POST /api/posts/:postId/comments
GET /api/posts/:postId/comments
4.2 用户管理API
获取用户信息
GET /api/users/:userId
关注/取消关注用户
POST /api/users/:userId/follow
DELETE /api/users/:userId/follow
4.3 搜索API
内容搜索
GET /api/search/posts
请求参数:
参数名 | 参数类型 | 是否必需 | 描述 |
---|---|---|---|
q | string | true | 搜索关键词 |
category | string | false | 内容分类 |
location | string | false | 位置筛选 |
sort | string | false | 排序方式 (latest/popular/relevant) |
5. 服务器架构图
6. 数据模型
6.1 数据模型定义
6.2 数据定义语言
用户表 (users)
-- 创建用户表
CREATE TABLE users (id UUID PRIMARY KEY DEFAULT gen_random_uuid(),email VARCHAR(255) UNIQUE NOT NULL,username VARCHAR(50) UNIQUE NOT NULL,nickname VARCHAR(100) NOT NULL,avatar_url TEXT,bio TEXT,location JSONB,is_verified BOOLEAN DEFAULT FALSE,followers_count INTEGER DEFAULT 0,following_count INTEGER DEFAULT 0,posts_count INTEGER DEFAULT 0,created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);-- 创建索引
CREATE INDEX idx_users_username ON users(username);
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_created_at ON users(created_at DESC);
内容表 (posts)
-- 创建内容表
CREATE TABLE posts (id UUID PRIMARY KEY DEFAULT gen_random_uuid(),user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,content TEXT NOT NULL,location JSONB,visibility VARCHAR(20) DEFAULT 'public' CHECK (visibility IN ('public', 'private', 'friends')),like_count INTEGER DEFAULT 0,comment_count INTEGER DEFAULT 0,share_count INTEGER DEFAULT 0,view_count INTEGER DEFAULT 0,created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);-- 创建索引
CREATE INDEX idx_posts_user_id ON posts(user_id);
CREATE INDEX idx_posts_created_at ON posts(created_at DESC);
CREATE INDEX idx_posts_visibility ON posts(visibility);
CREATE INDEX idx_posts_like_count ON posts(like_count DESC);
媒体文件表 (post_media)
-- 创建媒体文件表
CREATE TABLE post_media (id UUID PRIMARY KEY DEFAULT gen_random_uuid(),post_id UUID NOT NULL REFERENCES posts(id) ON DELETE CASCADE,media_type VARCHAR(20) NOT NULL CHECK (media_type IN ('image', 'video')),file_url TEXT NOT NULL,thumbnail_url TEXT,metadata JSONB,sort_order INTEGER DEFAULT 0,created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);-- 创建索引
CREATE INDEX idx_post_media_post_id ON post_media(post_id);
CREATE INDEX idx_post_media_sort_order ON post_media(post_id, sort_order);
评论表 (comments)
-- 创建评论表
CREATE TABLE comments (id UUID PRIMARY KEY DEFAULT gen_random_uuid(),post_id UUID NOT NULL REFERENCES posts(id) ON DELETE CASCADE,user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,parent_id UUID REFERENCES comments(id) ON DELETE CASCADE,content TEXT NOT NULL,like_count INTEGER DEFAULT 0,created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);-- 创建索引
CREATE INDEX idx_comments_post_id ON comments(post_id);
CREATE INDEX idx_comments_user_id ON comments(user_id);
CREATE INDEX idx_comments_parent_id ON comments(parent_id);
CREATE INDEX idx_comments_created_at ON comments(created_at DESC);
点赞表 (likes)
-- 创建点赞表
CREATE TABLE likes (id UUID PRIMARY KEY DEFAULT gen_random_uuid(),post_id UUID NOT NULL REFERENCES posts(id) ON DELETE CASCADE,user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),UNIQUE(post_id, user_id)
);-- 创建索引
CREATE INDEX idx_likes_post_id ON likes(post_id);
CREATE INDEX idx_likes_user_id ON likes(user_id);
CREATE INDEX idx_likes_created_at ON likes(created_at DESC);
关注表 (follows)
-- 创建关注表
CREATE TABLE follows (id UUID PRIMARY KEY DEFAULT gen_random_uuid(),follower_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,following_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),UNIQUE(follower_id, following_id),CHECK(follower_id != following_id)
);-- 创建索引
CREATE INDEX idx_follows_follower_id ON follows(follower_id);
CREATE INDEX idx_follows_following_id ON follows(following_id);
CREATE INDEX idx_follows_created_at ON follows(created_at DESC);
标签表 (tags)
-- 创建标签表
CREATE TABLE tags (id UUID PRIMARY KEY DEFAULT gen_random_uuid(),name VARCHAR(50) UNIQUE NOT NULL,usage_count INTEGER DEFAULT 0,created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);-- 创建内容标签关联表
CREATE TABLE post_tags (post_id UUID NOT NULL REFERENCES posts(id) ON DELETE CASCADE,tag_id UUID NOT NULL REFERENCES tags(id) ON DELETE CASCADE,PRIMARY KEY(post_id, tag_id)
);-- 创建索引
CREATE INDEX idx_tags_name ON tags(name);
CREATE INDEX idx_tags_usage_count ON tags(usage_count DESC);
CREATE INDEX idx_post_tags_post_id ON post_tags(post_id);
CREATE INDEX idx_post_tags_tag_id ON post_tags(tag_id);
权限设置
-- 为认证用户授予权限
GRANT ALL PRIVILEGES ON users TO authenticated;
GRANT ALL PRIVILEGES ON posts TO authenticated;
GRANT ALL PRIVILEGES ON post_media TO authenticated;
GRANT ALL PRIVILEGES ON comments TO authenticated;
GRANT ALL PRIVILEGES ON likes TO authenticated;
GRANT ALL PRIVILEGES ON follows TO authenticated;
GRANT ALL PRIVILEGES ON tags TO authenticated;
GRANT ALL PRIVILEGES ON post_tags TO authenticated;-- 为匿名用户授予只读权限
GRANT SELECT ON users TO anon;
GRANT SELECT ON posts TO anon;
GRANT SELECT ON post_media TO anon;
GRANT SELECT ON comments TO anon;
GRANT SELECT ON tags TO anon;
初始化数据
-- 插入示例标签
INSERT INTO tags (name, usage_count) VALUES
('旅行', 0),
('美食', 0),
('风景', 0),
('海滩', 0),
('山景', 0),
('城市', 0),
('文化', 0),
('冒险', 0);
天气预报功能模块产品需求文档
1. 产品概述
天气预报功能模块是旅行足迹应用的核心功能之一,为用户提供实时天气信息和未来预报,帮助用户更好地规划旅行行程。该模块将与主页无缝集成,提供直观、美观的天气信息展示界面。
-
为旅行者提供准确的天气信息,辅助旅行决策
-
通过动态图标和丰富的气象参数,提升用户体验
-
支持响应式设计,适配不同设备屏幕
2. 核心功能
2.1 用户角色
本模块面向所有应用用户,无需特殊权限区分。
2.2 功能模块
天气预报功能模块包含以下核心页面:
- 天气主页面:实时天气展示、三天预报、详细气象参数
- 天气详情页面:更详细的天气信息、小时级预报、历史天气
2.3 页面详情
页面名称 | 模块名称 | 功能描述 |
---|---|---|
天气主页面 | 实时天气卡片 | 显示当前温度、天气状况、城市信息,使用动态天气图标 |
天气主页面 | 三天预报区域 | 展示未来三天的天气预报,包括最高最低温度、天气图标 |
天气主页面 | 气象参数面板 | 显示湿度、风速、气压、紫外线指数等详细参数 |
天气主页面 | 位置选择器 | 支持手动选择城市或使用当前定位获取天气 |
天气详情页面 | 小时预报 | 显示24小时内的详细天气变化趋势 |
天气详情页面 | 生活指数 | 提供穿衣、运动、洗车等生活建议指数 |
3. 核心流程
用户操作流程:
- 用户在主页点击"天气预报"快捷按钮
- 系统自动获取用户当前位置(需要位置权限)
- 调用天气API获取实时天气和预报数据
- 展示天气主页面,包含实时天气、三天预报和气象参数
- 用户可点击查看更详细的天气信息
- 用户可手动切换城市查看其他地区天气
4. 用户界面设计
4.1 设计风格
-
主色调:蓝色系 (#2196F3) 和白色 (#FFFFFF)
-
辅助色:根据天气状况动态变化(晴天橙色、雨天灰蓝色、雪天浅蓝色)
-
按钮样式:圆角卡片式设计,带有轻微阴影效果
-
字体:主标题使用18-24px,副标题14-16px,参数文字12-14px
-
布局风格:卡片式布局,清晰的信息层次
-
图标风格:扁平化设计,支持动画效果的天气图标
4.2 页面设计概览
页面名称 | 模块名称 | UI元素 |
---|---|---|
天气主页面 | 实时天气卡片 | 大号温度显示、动态天气图标、城市名称、天气描述文字 |
天气主页面 | 三天预报区域 | 水平滚动卡片列表,每个卡片包含日期、天气图标、最高最低温度 |
天气主页面 | 气象参数面板 | 2x2网格布局,每个参数包含图标、数值和单位 |
天气详情页面 | 小时预报 | 水平滚动时间轴,显示温度曲线图和天气图标 |
4.3 动态天气图标系统
图标设计规范:
-
晴天:太阳图标,支持旋转动画
-
多云:云朵图标,支持飘动效果
-
雨天:雨滴动画效果
-
雪天:雪花飘落动画
-
雾霾:朦胧效果图标
-
夜晚:月亮和星星图标
图标尺寸:
-
主要天气图标:64x64px
-
预报列表图标:32x32px
-
参数图标:24x24px
4.4 响应式设计
-
移动端优先:针对手机屏幕优化布局
-
平板适配:支持横屏显示,调整卡片布局
-
Web端适配:支持桌面浏览器访问
-
触摸优化:按钮和交互区域符合触摸操作标准
5. 数据需求
5.1 天气数据结构
实时天气数据:
-
温度(当前、体感)
-
天气状况(晴、多云、雨等)
-
湿度百分比
-
风速和风向
-
气压值
-
紫外线指数
-
能见度
预报数据:
-
日期时间
-
最高最低温度
-
天气状况
-
降水概率
-
风速风向
5.2 位置数据
-
GPS坐标(经纬度)
-
城市名称
-
区域代码
-
时区信息
6. 技术要求
6.1 性能要求
-
天气数据加载时间不超过3秒
-
图标动画流畅,帧率不低于30fps
-
支持离线缓存,缓存时间1小时
6.2 兼容性要求
-
支持iOS 12+和Android 8+
-
支持主流Web浏览器
-
适配不同屏幕尺寸和分辨率
6.3 数据更新策略
-
实时天气数据每30分钟更新一次
-
预报数据每6小时更新一次
-
支持手动刷新功能
-
网络异常时显示缓存数据