feat: 新增海珠和番禺气象站
This commit is contained in:
parent
f1e54aab9f
commit
a127ddfeba
@ -31,6 +31,8 @@ func StartGinServer() error {
|
|||||||
r.GET("/", indexHandler)
|
r.GET("/", indexHandler)
|
||||||
r.GET("/radar/nanning", radarNanningHandler)
|
r.GET("/radar/nanning", radarNanningHandler)
|
||||||
r.GET("/radar/guangzhou", radarGuangzhouHandler)
|
r.GET("/radar/guangzhou", radarGuangzhouHandler)
|
||||||
|
r.GET("/radar/panyu", radarPanyuHandler)
|
||||||
|
r.GET("/radar/haizhu", radarHaizhuHandler)
|
||||||
|
|
||||||
// API路由组
|
// API路由组
|
||||||
api := r.Group("/api")
|
api := r.Group("/api")
|
||||||
@ -90,6 +92,28 @@ func radarGuangzhouHandler(c *gin.Context) {
|
|||||||
c.HTML(http.StatusOK, "radar_guangzhou.html", data)
|
c.HTML(http.StatusOK, "radar_guangzhou.html", data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// radarHaizhuHandler 海珠雷达站占位页
|
||||||
|
func radarHaizhuHandler(c *gin.Context) {
|
||||||
|
data := types.PageData{
|
||||||
|
Title: "海珠雷达站",
|
||||||
|
ServerTime: time.Now().Format("2006-01-02 15:04:05"),
|
||||||
|
OnlineDevices: database.GetOnlineDevicesCount(database.GetDB()),
|
||||||
|
TiandituKey: "0c260b8a094a4e0bc507808812cefdac",
|
||||||
|
}
|
||||||
|
c.HTML(http.StatusOK, "radar_haizhu.html", data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// radarPanyuHandler 番禺雷达站占位页
|
||||||
|
func radarPanyuHandler(c *gin.Context) {
|
||||||
|
data := types.PageData{
|
||||||
|
Title: "番禺雷达站",
|
||||||
|
ServerTime: time.Now().Format("2006-01-02 15:04:05"),
|
||||||
|
OnlineDevices: database.GetOnlineDevicesCount(database.GetDB()),
|
||||||
|
TiandituKey: "0c260b8a094a4e0bc507808812cefdac",
|
||||||
|
}
|
||||||
|
c.HTML(http.StatusOK, "radar_panyu.html", data)
|
||||||
|
}
|
||||||
|
|
||||||
// systemStatusHandler 处理系统状态API请求
|
// systemStatusHandler 处理系统状态API请求
|
||||||
func systemStatusHandler(c *gin.Context) {
|
func systemStatusHandler(c *gin.Context) {
|
||||||
status := types.SystemStatus{
|
status := types.SystemStatus{
|
||||||
|
|||||||
@ -6,6 +6,8 @@
|
|||||||
<a href="/" class="text-blue-600 hover:text-blue-700">首页</a>
|
<a href="/" class="text-blue-600 hover:text-blue-700">首页</a>
|
||||||
<a href="/radar/nanning" class="text-blue-600 hover:text-blue-700">南宁雷达站</a>
|
<a href="/radar/nanning" class="text-blue-600 hover:text-blue-700">南宁雷达站</a>
|
||||||
<a href="/radar/guangzhou" class="text-blue-600 hover:text-blue-700">广州雷达站</a>
|
<a href="/radar/guangzhou" class="text-blue-600 hover:text-blue-700">广州雷达站</a>
|
||||||
|
<a href="/radar/panyu" class="text-blue-600 hover:text-blue-700">番禺雷达站</a>
|
||||||
|
<a href="/radar/haizhu" class="text-blue-600 hover:text-blue-700">海珠雷达站</a>
|
||||||
</nav>
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@ -222,14 +222,28 @@
|
|||||||
const base = forcedDt ? new Date(forcedDt.replace(/-/g,'/')) : new Date(t.dt.replace(/-/g,'/'));
|
const base = forcedDt ? new Date(forcedDt.replace(/-/g,'/')) : new Date(t.dt.replace(/-/g,'/'));
|
||||||
// 记录本次瓦片时间供 ETA 使用
|
// 记录本次瓦片时间供 ETA 使用
|
||||||
gTileDT = base;
|
gTileDT = base;
|
||||||
const ceil10=new Date(base); const m=base.getMinutes(); const up=(Math.floor(m/10)*10+10)%60; ceil10.setMinutes(up,0,0); if(up===0){ ceil10.setHours(base.getHours()+1); }
|
await fetchRealtimeWithFallback(base);
|
||||||
const pad=(n)=>String(n).padStart(2,'0'); const dtStr=`${ceil10.getFullYear()}-${pad(ceil10.getMonth()+1)}-${pad(ceil10.getDate())} ${pad(ceil10.getHours())}:${pad(ceil10.getMinutes())}:00`;
|
|
||||||
await loadRealtimeAt(dtStr);
|
|
||||||
maybeCalcSector();
|
maybeCalcSector();
|
||||||
maybePlotSquare();
|
maybePlotSquare();
|
||||||
}catch(e){ await loadRealtimeLatest(); maybeCalcSector(); maybePlotSquare(); }
|
}catch(e){ await loadRealtimeLatest(); maybeCalcSector(); maybePlotSquare(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function fetchRealtimeWithFallback(base){
|
||||||
|
const pad=(n)=>String(n).padStart(2,'0');
|
||||||
|
// 尝试取下一10分钟整(和雷达瓦片时间对齐)
|
||||||
|
const ceil10=new Date(base); const m=base.getMinutes(); const up=(Math.floor(m/10)*10+10)%60; ceil10.setMinutes(up,0,0); if(up===0){ ceil10.setHours(base.getHours()+1); }
|
||||||
|
let dtStr=`${ceil10.getFullYear()}-${pad(ceil10.getMonth()+1)}-${pad(ceil10.getDate())} ${pad(ceil10.getHours())}:${pad(ceil10.getMinutes())}:00`;
|
||||||
|
let res=await fetch(`/api/radar/weather_at?alias=${encodeURIComponent(ST_ALIAS)}&dt=${encodeURIComponent(dtStr)}`);
|
||||||
|
if(res.ok){ const r=await res.json(); fillRealtime(r); return; }
|
||||||
|
// 若没有10分钟数据,退回到当前小时的整点
|
||||||
|
const hour0=new Date(base); hour0.setMinutes(0,0,0);
|
||||||
|
dtStr=`${hour0.getFullYear()}-${pad(hour0.getMonth()+1)}-${pad(hour0.getDate())} ${pad(hour0.getHours())}:00:00`;
|
||||||
|
res=await fetch(`/api/radar/weather_at?alias=${encodeURIComponent(ST_ALIAS)}&dt=${encodeURIComponent(dtStr)}`);
|
||||||
|
if(res.ok){ const r=await res.json(); fillRealtime(r); return; }
|
||||||
|
// 最后退回最新
|
||||||
|
await loadRealtimeLatest();
|
||||||
|
}
|
||||||
|
|
||||||
async function loadRealtimeLatest(){
|
async function loadRealtimeLatest(){
|
||||||
const res=await fetch(`/api/radar/weather_latest?alias=${encodeURIComponent(ST_ALIAS)}`);
|
const res=await fetch(`/api/radar/weather_latest?alias=${encodeURIComponent(ST_ALIAS)}`);
|
||||||
if(!res.ok) throw new Error('加载实时气象失败');
|
if(!res.ok) throw new Error('加载实时气象失败');
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user