Refine ops dashboards and align browser extension data views
This commit is contained in:
+5
-3
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
1. 自动识别当前 Polymarket 页面中的城市,也支持手动切换。
|
1. 自动识别当前 Polymarket 页面中的城市,也支持手动切换。
|
||||||
2. 展示城市档案:结算站点、站点距离、观测更新时间、周边站点数量。
|
2. 展示城市档案:结算站点、站点距离、观测更新时间、周边站点数量。
|
||||||
3. 展示今日日内走势(简版):`DEB` 走势与官方观测(`METAR / HKO / CWA`)对照,可悬停查看时间与温度。
|
3. 展示今日日内走势(简版):`DEB` 走势与官方观测(`METAR / HKO / CWA / Wunderground`)对照,可悬停查看时间与温度。
|
||||||
4. 展示多日最高温预报(简版),当前以 `DEB` 优先。
|
4. 展示多日最高温预报(简版),当前以 `DEB` 优先。
|
||||||
5. 支持一键刷新,强制拉取最新温度数据。
|
5. 支持一键刷新,强制拉取最新温度数据。
|
||||||
6. 支持本地缓存,提升打开速度;刷新时自动更新缓存。
|
6. 支持本地缓存,提升打开速度;刷新时自动更新缓存。
|
||||||
@@ -15,7 +15,8 @@
|
|||||||
## 数据说明
|
## 数据说明
|
||||||
|
|
||||||
- 香港使用 `HKO`(香港天文台)结算源。
|
- 香港使用 `HKO`(香港天文台)结算源。
|
||||||
- 其他城市按配置使用 `METAR / NOAA / 官方数据源`。
|
- 其他城市按配置使用 `METAR / NOAA / Wunderground / 官方数据源`。
|
||||||
|
- 城市展示名以主站返回值为准,例如 `aurora` 市场在插件中会显示为 `Denver`。
|
||||||
|
|
||||||
## 权限说明
|
## 权限说明
|
||||||
|
|
||||||
@@ -49,5 +50,6 @@
|
|||||||
|
|
||||||
- 当前版本仍是轻量产品,重点是“监控 + 基础判断 + 导流回站”,未接入支付链路。
|
- 当前版本仍是轻量产品,重点是“监控 + 基础判断 + 导流回站”,未接入支付链路。
|
||||||
- 若你的 API 做了严格鉴权,请先在设置页填写 token 再使用。
|
- 若你的 API 做了严格鉴权,请先在设置页填写 token 再使用。
|
||||||
- 台北现在按 `NOAA RCTP` 结算参考展示。
|
- 插件会按主站返回的结算源展示参考口径,例如 `Taipei / Shenzhen` 当前走 `Wunderground`,`Hong Kong / Lau Fau Shan` 走 `HKO`。
|
||||||
|
- 点击“打开网站查看更多”会回到主站继续查看完整分析。
|
||||||
- 插件不会承载完整分析;完整结构判断、历史对账和更多信号仍以主站为准。
|
- 插件不会承载完整分析;完整结构判断、历史对账和更多信号仍以主站为准。
|
||||||
|
|||||||
+35
-9
@@ -20,7 +20,8 @@ const I18N = {
|
|||||||
settlementAirport: "结算机场",
|
settlementAirport: "结算机场",
|
||||||
hko: "香港天文台 (HKO)",
|
hko: "香港天文台 (HKO)",
|
||||||
cwa: "交通部中央气象署 (CWA)",
|
cwa: "交通部中央气象署 (CWA)",
|
||||||
noaa: "NOAA RCTP(台湾桃园国际机场)",
|
noaa: "NOAA 官方时序",
|
||||||
|
wunderground: "Wunderground 结算站",
|
||||||
city: "城市",
|
city: "城市",
|
||||||
refresh: "刷新数据",
|
refresh: "刷新数据",
|
||||||
cityProfile: "城市档案",
|
cityProfile: "城市档案",
|
||||||
@@ -38,9 +39,12 @@ const I18N = {
|
|||||||
nearbyMonitoringSuffix: "个参与监控",
|
nearbyMonitoringSuffix: "个参与监控",
|
||||||
today: "今天",
|
today: "今天",
|
||||||
omSeries: "OM预测",
|
omSeries: "OM预测",
|
||||||
noaaSettlementRef: "NOAA RCTP 结算参考",
|
noaaSettlementRef: "NOAA 结算参考",
|
||||||
noaaSettlementLegend:
|
noaaSettlementLegend:
|
||||||
"台北按 NOAA RCTP 最终完成质控后的最高整度摄氏值结算;图中曲线仅作结算参考。",
|
"该城市按 NOAA 最终完成质控后的最高整度读数结算;图中曲线仅作结算参考。",
|
||||||
|
wundergroundSettlementRef: "Wunderground 结算参考",
|
||||||
|
wundergroundSettlementLegend:
|
||||||
|
"该城市按配置的 Wunderground 站点结算;图中曲线仅作结算参考。",
|
||||||
loadCityDetailFailed: "加载城市详情失败",
|
loadCityDetailFailed: "加载城市详情失败",
|
||||||
refreshFailed: "刷新温度数据失败",
|
refreshFailed: "刷新温度数据失败",
|
||||||
initFailed: "初始化失败",
|
initFailed: "初始化失败",
|
||||||
@@ -81,7 +85,8 @@ const I18N = {
|
|||||||
settlementAirport: "Settlement Airport",
|
settlementAirport: "Settlement Airport",
|
||||||
hko: "Hong Kong Observatory (HKO)",
|
hko: "Hong Kong Observatory (HKO)",
|
||||||
cwa: "Central Weather Administration (CWA)",
|
cwa: "Central Weather Administration (CWA)",
|
||||||
noaa: "NOAA RCTP (Taiwan Taoyuan International Airport)",
|
noaa: "NOAA official timeseries",
|
||||||
|
wunderground: "Wunderground settlement station",
|
||||||
city: "City",
|
city: "City",
|
||||||
refresh: "Refresh data",
|
refresh: "Refresh data",
|
||||||
cityProfile: "City Profile",
|
cityProfile: "City Profile",
|
||||||
@@ -99,9 +104,12 @@ const I18N = {
|
|||||||
nearbyMonitoringSuffix: " stations monitored",
|
nearbyMonitoringSuffix: " stations monitored",
|
||||||
today: "Today",
|
today: "Today",
|
||||||
omSeries: "OM Forecast",
|
omSeries: "OM Forecast",
|
||||||
noaaSettlementRef: "NOAA RCTP Settlement Reference",
|
noaaSettlementRef: "NOAA Settlement Reference",
|
||||||
noaaSettlementLegend:
|
noaaSettlementLegend:
|
||||||
"Taipei settles on NOAA RCTP using the finalized highest rounded whole-degree Celsius reading; the plotted line is only a settlement reference.",
|
"This city settles on NOAA using the finalized highest rounded reading; the plotted line is only a settlement reference.",
|
||||||
|
wundergroundSettlementRef: "Wunderground Settlement Reference",
|
||||||
|
wundergroundSettlementLegend:
|
||||||
|
"This city settles on the configured Wunderground station; the plotted line is only a settlement reference.",
|
||||||
loadCityDetailFailed: "Failed to load city detail",
|
loadCityDetailFailed: "Failed to load city detail",
|
||||||
refreshFailed: "Failed to refresh weather data",
|
refreshFailed: "Failed to refresh weather data",
|
||||||
initFailed: "Initialization failed",
|
initFailed: "Initialization failed",
|
||||||
@@ -471,6 +479,7 @@ function riskText(level) {
|
|||||||
|
|
||||||
function getSettlementSourceDisplay(detail) {
|
function getSettlementSourceDisplay(detail) {
|
||||||
const source = String(detail?.current?.settlement_source || "").toLowerCase();
|
const source = String(detail?.current?.settlement_source || "").toLowerCase();
|
||||||
|
const sourceLabel = String(detail?.current?.settlement_source_label || "").trim();
|
||||||
if (source === "hko") {
|
if (source === "hko") {
|
||||||
return {
|
return {
|
||||||
label: t("settlementSource"),
|
label: t("settlementSource"),
|
||||||
@@ -489,6 +498,14 @@ function getSettlementSourceDisplay(detail) {
|
|||||||
value: t("noaa")
|
value: t("noaa")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
if (source === "wunderground") {
|
||||||
|
const stationLabel = sourceLabel || t("wunderground");
|
||||||
|
const station = String(detail?.current?.station_code || detail?.risk?.icao || "").trim();
|
||||||
|
return {
|
||||||
|
label: t("settlementSource"),
|
||||||
|
value: station ? `${stationLabel} (${station})` : stationLabel
|
||||||
|
};
|
||||||
|
}
|
||||||
const airport = detail?.risk?.airport || "--";
|
const airport = detail?.risk?.airport || "--";
|
||||||
const icao = detail?.risk?.icao ? ` (${detail.risk.icao})` : "";
|
const icao = detail?.risk?.icao ? ` (${detail.risk.icao})` : "";
|
||||||
return {
|
return {
|
||||||
@@ -727,7 +744,9 @@ function drawTrendChart(detail) {
|
|||||||
const sourceCode = String(detail?.current?.settlement_source || "").toLowerCase();
|
const sourceCode = String(detail?.current?.settlement_source || "").toLowerCase();
|
||||||
const obsSeriesLabel = sourceCode === "noaa"
|
const obsSeriesLabel = sourceCode === "noaa"
|
||||||
? t("noaaSettlementRef")
|
? t("noaaSettlementRef")
|
||||||
: String(detail?.current?.settlement_source_label || "OBS").toUpperCase();
|
: sourceCode === "wunderground"
|
||||||
|
? t("wundergroundSettlementRef")
|
||||||
|
: String(detail?.current?.settlement_source_label || "OBS").toUpperCase();
|
||||||
if (!points.length) {
|
if (!points.length) {
|
||||||
setChartHover([], tempSymbol);
|
setChartHover([], tempSymbol);
|
||||||
ctx.fillStyle = "#8ba0be";
|
ctx.fillStyle = "#8ba0be";
|
||||||
@@ -987,6 +1006,7 @@ function renderDetail(detail) {
|
|||||||
state.detail = detail;
|
state.detail = detail;
|
||||||
renderRiskBadge(detail);
|
renderRiskBadge(detail);
|
||||||
renderFreshness(detail);
|
renderFreshness(detail);
|
||||||
|
const tempSymbol = detail?.temp_symbol || "°C";
|
||||||
|
|
||||||
const profile = getSettlementSourceDisplay(detail);
|
const profile = getSettlementSourceDisplay(detail);
|
||||||
els.settlementLabel.textContent = profile.label;
|
els.settlementLabel.textContent = profile.label;
|
||||||
@@ -1007,6 +1027,8 @@ function renderDetail(detail) {
|
|||||||
const sourceCode = String(detail?.current?.settlement_source || "").toLowerCase();
|
const sourceCode = String(detail?.current?.settlement_source || "").toLowerCase();
|
||||||
const sourceTag = sourceCode === "noaa"
|
const sourceTag = sourceCode === "noaa"
|
||||||
? t("noaaSettlementRef")
|
? t("noaaSettlementRef")
|
||||||
|
: sourceCode === "wunderground"
|
||||||
|
? t("wundergroundSettlementRef")
|
||||||
: String(detail?.current?.settlement_source_label || "").toUpperCase() || "OBS";
|
: String(detail?.current?.settlement_source_label || "").toUpperCase() || "OBS";
|
||||||
const obs = getObservationRows(detail);
|
const obs = getObservationRows(detail);
|
||||||
if (obs.length >= 2) {
|
if (obs.length >= 2) {
|
||||||
@@ -1014,12 +1036,16 @@ function renderDetail(detail) {
|
|||||||
const last = obs[obs.length - 1];
|
const last = obs[obs.length - 1];
|
||||||
els.chartLegend.textContent =
|
els.chartLegend.textContent =
|
||||||
sourceCode === "noaa"
|
sourceCode === "noaa"
|
||||||
? `${sourceTag}: ${first.temp}°C@${first.time} -> ${last.temp}°C@${last.time} | ${t("noaaSettlementLegend")}`
|
? `${sourceTag}: ${first.temp}${tempSymbol}@${first.time} -> ${last.temp}${tempSymbol}@${last.time} | ${t("noaaSettlementLegend")}`
|
||||||
: `${sourceTag}: ${first.temp}°C@${first.time} -> ${last.temp}°C@${last.time}`;
|
: sourceCode === "wunderground"
|
||||||
|
? `${sourceTag}: ${first.temp}${tempSymbol}@${first.time} -> ${last.temp}${tempSymbol}@${last.time} | ${t("wundergroundSettlementLegend")}`
|
||||||
|
: `${sourceTag}: ${first.temp}${tempSymbol}@${first.time} -> ${last.temp}${tempSymbol}@${last.time}`;
|
||||||
} else {
|
} else {
|
||||||
els.chartLegend.textContent =
|
els.chartLegend.textContent =
|
||||||
sourceCode === "noaa"
|
sourceCode === "noaa"
|
||||||
? `${sourceTag}: ${t("noContinuousObs")} | ${t("noaaSettlementLegend")}`
|
? `${sourceTag}: ${t("noContinuousObs")} | ${t("noaaSettlementLegend")}`
|
||||||
|
: sourceCode === "wunderground"
|
||||||
|
? `${sourceTag}: ${t("noContinuousObs")} | ${t("wundergroundSettlementLegend")}`
|
||||||
: `${sourceTag}: ${t("noContinuousObs")}`;
|
: `${sourceTag}: ${t("noContinuousObs")}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user