sz-weather-next/
├── app/
│ ├── layout.jsx # 根布局(HTML结构、Meta标签、PWA配置)
│ ├── page.jsx # 主页面(状态管理、组件组合)
│ └── globals.css # 全局样式(深色主题、动画)
├── components/
│ ├── Header.jsx # 顶部状态栏
│ ├── VideoPlayer.jsx # 视频播放器(核心逻辑)
│ └── CameraTabs.jsx # 摄像头选择标签
├── lib/
│ └── cameras.js # 摄像头数据 + 工具函数
├── public/
│ ├── icons/ # PWA 图标
│ └── manifest.json # PWA 配置文件
└── next.config.mjs # Next.js 配置(PWA插件)
存放所有摄像头配置和视频相关工具函数:
// 摄像头列表(13个)
export const CAMERAS = [
{ id: 73, name: '福田东' },
{ id: 78, name: '福田西' },
// ...
];
// 工具函数
getVideoTimestamp(timeSuffix) // 计算当前视频时间戳
formatVideoTimestamp(date) // 格式化为 YYYYMMDDHHMM
formatDisplayTime(date) // 格式化为 HH:MM
getPreviousTimestamp(date) // 获取上一个可用时间点
getVideoUrl(camera, timestamp) // 生成视频URL为什么用 timeSuffix?
- 大部分摄像头每20分钟更新一次视频(19/39/59)
- 部分摄像头是 18/38/58(蛇口码头、石岩观测场)
定义 HTML 结构和全局 Meta 标签:
// PWA 相关
- apple-mobile-web-app-capable
- apple-mobile-web-app-status-bar-style
- theme-color
- manifest.json
// SEO
- title
- description
- lang="zh-CN"负责状态管理和组件组合:
// 状态
const [currentCameraIndex, setCurrentCameraIndex] = useState(0) // 当前摄像头
const [updateTime, setUpdateTime] = useState('--:--') // 视频时间
// 渲染
<Header cameraName={...} updateTime={...} />
<VideoPlayer currentCameraIndex={...} onTimeUpdate={...} />
<CameraTabs currentCameraIndex={...} onCameraSelect={...} />纯展示组件,接收 props:
cameraName: 当前摄像头名称updateTime: 视频时间isLive: 是否直播中(暂未使用)
核心逻辑组件,处理视频播放:
// 状态
const [isLoading, setIsLoading] = useState(true) // 加载中
const [hasError, setHasError] = useState(false) // 错误
// 主要功能
1. 初始化加载视频
2. 自动刷新(每20秒检查新视频)
3. 错误重试(最多2次,回退到上一个时间点)
4. 页面可见性处理(切后台时暂停)
5. 全屏控制视频加载流程:
- 计算当前时间戳 → 生成 URL
- 显示 loading
- 视频 canplay → 播放
- 视频 error → 重试或显示错误
纯展示组件,渲染摄像头列表:
- 从
lib/cameras.js导入CAMERAS - 点击时调用
onCameraSelect(index)回调
保留了原来的深色主题样式:
- CSS Variables 定义颜色、间距
- 深空蓝配色(#050a14 背景)
- 青色强调色(#00d4ff)
- 动画效果(淡入、滑动)
- 响应式布局
在 lib/cameras.js 的 CAMERAS 数组中添加:
{ id: 新ID, name: '新名称', timeSuffix: 8 } // 如果需要特殊时间戳在 components/VideoPlayer.jsx 中修改:
setInterval(() => { ... }, 20000) // 毫秒在 app/ 目录下创建新文件:
about/page.jsx→ /aboutsettings/page.jsx→ /settings
- 多视频网格视图 - 同时展示多个摄像头画面(2x2 或 3x3)
- 日出日落推荐 - 自动检测并推荐最美的日出日落画面
- 地图功能 - 用 Leaflet.js 添加地图展示
- 用户偏好 - 用 localStorage 保存最后选择的摄像头
- 更丰富的主题 - 切换深浅色
- 服务端渲染 - 静态生成预渲染首屏