release: bump version to 0.35.1
This commit is contained in:
@@ -8,6 +8,19 @@ This project follows the repository versioning rule:
|
|||||||
- `improvement` -> `+0.0.1`(bugfix + 小功能混合)
|
- `improvement` -> `+0.0.1`(bugfix + 小功能混合)
|
||||||
- `bugfix` -> `+0.0.1`
|
- `bugfix` -> `+0.0.1`
|
||||||
|
|
||||||
|
## [0.35.1] — 2026-04-22
|
||||||
|
|
||||||
|
### ✨ Highlights
|
||||||
|
- Earth 统计展示改为统一 `data-earth-stat` 绑定机制,桌面 HUD 和移动端抽屉复用同一套状态更新入口
|
||||||
|
|
||||||
|
### 🔧 Improvements
|
||||||
|
- 收口海缆、登陆点、卫星、BGP 事件与 BGP 状态的统计写入逻辑,减少后续继续补桌面/移动双写分支的成本
|
||||||
|
|
||||||
|
### 🐛 Fixes
|
||||||
|
- 修复移动端态势抽屉中的海缆、登陆点与 BGP 统计在图层切换后可能停留旧值的问题
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## [0.35.0] — 2026-04-22
|
## [0.35.0] — 2026-04-22
|
||||||
|
|
||||||
### ✨ Highlights
|
### ✨ Highlights
|
||||||
|
|||||||
@@ -16,12 +16,13 @@
|
|||||||
## Current Version
|
## Current Version
|
||||||
|
|
||||||
- `main` 当前主线历史推导到:`0.16.5`
|
- `main` 当前主线历史推导到:`0.16.5`
|
||||||
- `dev` 当前开发分支历史推导到:`0.35.0`
|
- `dev` 当前开发分支历史推导到:`0.35.1`
|
||||||
|
|
||||||
## Timeline
|
## Timeline
|
||||||
|
|
||||||
| Version | Type | Branch | Commit | Summary |
|
| Version | Type | Branch | Commit | Summary |
|
||||||
| --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- |
|
||||||
|
| `0.35.1` | bugfix | `dev` | `pending` | 收口 Earth 桌面 HUD 与移动端抽屉的统一统计绑定机制,修复态势统计在图层切换后的同步遗漏 |
|
||||||
| `0.35.0` | feature | `dev` | `pending` | Earth 移动端抽屉系统与悬浮卡片全面上线:手势驱动抽屉、点击物件弹出可拖动详情卡、单指旋转双指缩放地球 |
|
| `0.35.0` | feature | `dev` | `pending` | Earth 移动端抽屉系统与悬浮卡片全面上线:手势驱动抽屉、点击物件弹出可拖动详情卡、单指旋转双指缩放地球 |
|
||||||
| `0.34.0` | feature | `dev` | `pending` | Earth 搜索面板正式接入,`planet.sh --allow-lan` 打通 Bun + Vite 局域网开放链路,并自动输出推荐访问地址与健康检查地址 |
|
| `0.34.0` | feature | `dev` | `pending` | Earth 搜索面板正式接入,`planet.sh --allow-lan` 打通 Bun + Vite 局域网开放链路,并自动输出推荐访问地址与健康检查地址 |
|
||||||
| `0.33.0` | feature | `dev` | `pending` | `news_live_streams` 默认接入 iptv-org 频道目录,内置数据源支持直接编辑 override,并修复 TV 合并采集源后默认频道消失的问题 |
|
| `0.33.0` | feature | `dev` | `pending` | `news_live_streams` 默认接入 iptv-org 频道目录,内置数据源支持直接编辑 override,并修复 TV 合并采集源后默认频道消失的问题 |
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "planet-frontend",
|
"name": "planet-frontend",
|
||||||
"version": "0.35.0",
|
"version": "0.35.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"packageManager": "bun@1",
|
"packageManager": "bun@1",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -282,23 +282,23 @@
|
|||||||
<!-- 2-col KPI grid -->
|
<!-- 2-col KPI grid -->
|
||||||
<div class="stats-grid">
|
<div class="stats-grid">
|
||||||
<div class="stat-cell">
|
<div class="stat-cell">
|
||||||
<span class="stat-num" id="cable-count">—</span>
|
<span class="stat-num" id="cable-count" data-earth-stat="cable-count">—</span>
|
||||||
<span class="stat-label">海缆系统</span>
|
<span class="stat-label">海缆系统</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="stat-cell">
|
<div class="stat-cell">
|
||||||
<span class="stat-num" id="landing-point-count">—</span>
|
<span class="stat-num" id="landing-point-count" data-earth-stat="landing-point-count">—</span>
|
||||||
<span class="stat-label">登陆点</span>
|
<span class="stat-label">登陆点</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="stat-cell">
|
<div class="stat-cell">
|
||||||
<span class="stat-num" id="satellite-count">—</span>
|
<span class="stat-num" id="satellite-count" data-earth-stat="satellite-count">—</span>
|
||||||
<span class="stat-label">在轨卫星</span>
|
<span class="stat-label">在轨卫星</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="stat-cell">
|
<div class="stat-cell">
|
||||||
<span class="stat-num" id="bgp-anomaly-count">—</span>
|
<span class="stat-num" id="bgp-anomaly-count" data-earth-stat="bgp-anomaly-count">—</span>
|
||||||
<span class="stat-label">BGP 事件</span>
|
<span class="stat-label">BGP 事件</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="stat-cell">
|
<div class="stat-cell">
|
||||||
<span class="stat-num" id="bgp-collector-count">—</span>
|
<span class="stat-num" id="bgp-collector-count" data-earth-stat="bgp-collector-count">—</span>
|
||||||
<span class="stat-label">BGP 观测站</span>
|
<span class="stat-label">BGP 观测站</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="stat-cell">
|
<div class="stat-cell">
|
||||||
@@ -310,12 +310,12 @@
|
|||||||
<!-- BGP status footer -->
|
<!-- BGP status footer -->
|
||||||
<div class="stats-footer">
|
<div class="stats-footer">
|
||||||
<span class="stats-footer-dot"></span>
|
<span class="stats-footer-dot"></span>
|
||||||
<span id="bgp-status-summary" class="stats-footer-text">暂无观测数据</span>
|
<span id="bgp-status-summary" class="stats-footer-text" data-earth-stat="bgp-status-summary">暂无观测数据</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- hidden elements kept for JS compatibility -->
|
<!-- hidden elements kept for JS compatibility -->
|
||||||
<span id="terrain-status" hidden></span>
|
<span id="terrain-status" data-earth-stat="terrain-status" hidden></span>
|
||||||
<span id="texture-quality" hidden></span>
|
<span id="texture-quality" data-earth-stat="texture-quality" hidden></span>
|
||||||
<span id="camera-distance" hidden></span>
|
<span id="camera-distance" hidden></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -486,19 +486,19 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="earth-mobile-stats-grid">
|
<div class="earth-mobile-stats-grid">
|
||||||
<div class="earth-mobile-stat-card">
|
<div class="earth-mobile-stat-card">
|
||||||
<span id="mobile-cable-count" class="earth-mobile-stat-num">—</span>
|
<span id="mobile-cable-count" class="earth-mobile-stat-num" data-earth-stat="cable-count">—</span>
|
||||||
<span class="earth-mobile-stat-label">海缆系统</span>
|
<span class="earth-mobile-stat-label">海缆系统</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="earth-mobile-stat-card">
|
<div class="earth-mobile-stat-card">
|
||||||
<span id="mobile-landing-point-count" class="earth-mobile-stat-num">—</span>
|
<span id="mobile-landing-point-count" class="earth-mobile-stat-num" data-earth-stat="landing-point-count">—</span>
|
||||||
<span class="earth-mobile-stat-label">登陆点</span>
|
<span class="earth-mobile-stat-label">登陆点</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="earth-mobile-stat-card">
|
<div class="earth-mobile-stat-card">
|
||||||
<span id="mobile-satellite-count" class="earth-mobile-stat-num">—</span>
|
<span id="mobile-satellite-count" class="earth-mobile-stat-num" data-earth-stat="satellite-count">—</span>
|
||||||
<span class="earth-mobile-stat-label">在轨卫星</span>
|
<span class="earth-mobile-stat-label">在轨卫星</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="earth-mobile-stat-card">
|
<div class="earth-mobile-stat-card">
|
||||||
<span id="mobile-bgp-anomaly-count" class="earth-mobile-stat-num">—</span>
|
<span id="mobile-bgp-anomaly-count" class="earth-mobile-stat-num" data-earth-stat="bgp-anomaly-count">—</span>
|
||||||
<span class="earth-mobile-stat-label">BGP 事件</span>
|
<span class="earth-mobile-stat-label">BGP 事件</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -509,7 +509,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="earth-mobile-situation-card">
|
<div class="earth-mobile-situation-card">
|
||||||
<div class="earth-mobile-situation-card-title">BGP 状态</div>
|
<div class="earth-mobile-situation-card-title">BGP 状态</div>
|
||||||
<div id="mobile-bgp-status-summary" class="earth-mobile-situation-status">暂无观测数据</div>
|
<div id="mobile-bgp-status-summary" class="earth-mobile-situation-status" data-earth-stat="bgp-status-summary">暂无观测数据</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import {
|
|||||||
CABLE_CONFIG,
|
CABLE_CONFIG,
|
||||||
} from "./constants.js";
|
} from "./constants.js";
|
||||||
import { latLonToVector3 } from "./utils.js";
|
import { latLonToVector3 } from "./utils.js";
|
||||||
import { updateEarthStats, showStatusMessage } from "./ui.js";
|
import { setEarthStatValue, updateEarthStats, showStatusMessage } from "./ui.js";
|
||||||
import { showInfoCard } from "./info-card.js";
|
import { showInfoCard } from "./info-card.js";
|
||||||
import { setLegendItems, setLegendMode } from "./legend.js";
|
import { setLegendItems, setLegendMode } from "./legend.js";
|
||||||
|
|
||||||
@@ -336,9 +336,8 @@ export async function loadGeoJSONFromPath(scene, earthObj, options = {}) {
|
|||||||
feature.properties.status === "In Service"),
|
feature.properties.status === "In Service"),
|
||||||
).length;
|
).length;
|
||||||
|
|
||||||
const cableCountEl = document.getElementById("cable-count");
|
|
||||||
const statusEl = document.getElementById("cable-status-summary");
|
const statusEl = document.getElementById("cable-status-summary");
|
||||||
if (cableCountEl) cableCountEl.textContent = cableCount + "个";
|
setEarthStatValue("cable-count", `${cableCount}个`);
|
||||||
if (statusEl) statusEl.textContent = `${inServiceCount}/${cableCount} 运行中`;
|
if (statusEl) statusEl.textContent = `${inServiceCount}/${cableCount} 运行中`;
|
||||||
|
|
||||||
updateEarthStats({
|
updateEarthStats({
|
||||||
@@ -435,10 +434,7 @@ export async function loadLandingPoints(scene, earthObj, options = {}) {
|
|||||||
validCount++;
|
validCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
const landingPointCountEl = document.getElementById("landing-point-count");
|
setEarthStatValue("landing-point-count", `${validCount}个`);
|
||||||
if (landingPointCountEl) {
|
|
||||||
landingPointCountEl.textContent = validCount + "个";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!silent) {
|
if (!silent) {
|
||||||
showStatusMessage(`成功加载 ${validCount} 个登陆点`, "success");
|
showStatusMessage(`成功加载 ${validCount} 个登陆点`, "success");
|
||||||
|
|||||||
14
frontend/public/earth/js/controls.js
vendored
14
frontend/public/earth/js/controls.js
vendored
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import * as THREE from "three";
|
import * as THREE from "three";
|
||||||
import { CONFIG, EARTH_CONFIG, ROTATION_MODE } from "./constants.js";
|
import { CONFIG, EARTH_CONFIG, ROTATION_MODE } from "./constants.js";
|
||||||
import { updateZoomDisplay, showStatusMessage } from "./ui.js";
|
import { setEarthStatValue, updateZoomDisplay, showStatusMessage } from "./ui.js";
|
||||||
import { toggleTerrain, setDayNightEnabled } from "./earth.js";
|
import { toggleTerrain, setDayNightEnabled } from "./earth.js";
|
||||||
import { setCelestialDayNightEnabled } from "./celestial.js";
|
import { setCelestialDayNightEnabled } from "./celestial.js";
|
||||||
import {
|
import {
|
||||||
@@ -873,12 +873,7 @@ async function setSatellitesLayerEnabled(button, enabled, { persist = true, sile
|
|||||||
if (!enabled && !silent) {
|
if (!enabled && !silent) {
|
||||||
showStatusMessage("卫星已隐藏", "info");
|
showStatusMessage("卫星已隐藏", "info");
|
||||||
} else if (enabled) {
|
} else if (enabled) {
|
||||||
["satellite-count", "mobile-satellite-count"].forEach((id) => {
|
setEarthStatValue("satellite-count", `${getSatelliteCount()} 颗`);
|
||||||
const satelliteCountEl = document.getElementById(id);
|
|
||||||
if (satelliteCountEl) {
|
|
||||||
satelliteCountEl.textContent = `${getSatelliteCount()} 颗`;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
syncMobileLayerCards();
|
syncMobileLayerCards();
|
||||||
if (persist) persistEarthSettings();
|
if (persist) persistEarthSettings();
|
||||||
@@ -906,10 +901,7 @@ function setBGPLayerEnabled(button, enabled, { persist = true, silent = false }
|
|||||||
active: enabled,
|
active: enabled,
|
||||||
tooltip: enabled ? "隐藏BGP观测" : "显示BGP观测",
|
tooltip: enabled ? "隐藏BGP观测" : "显示BGP观测",
|
||||||
});
|
});
|
||||||
const bgpCountEl = document.getElementById("bgp-anomaly-count");
|
setEarthStatValue("bgp-anomaly-count", `${getBGPCount()} 条`);
|
||||||
if (bgpCountEl) {
|
|
||||||
bgpCountEl.textContent = `${getBGPCount()} 条`;
|
|
||||||
}
|
|
||||||
syncMobileLayerCards();
|
syncMobileLayerCards();
|
||||||
if (persist) persistEarthSettings();
|
if (persist) persistEarthSettings();
|
||||||
if (!silent) {
|
if (!silent) {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import {
|
|||||||
updateCoordinatesDisplay,
|
updateCoordinatesDisplay,
|
||||||
updateZoomDisplay,
|
updateZoomDisplay,
|
||||||
updateEarthStats,
|
updateEarthStats,
|
||||||
|
setEarthStatValue,
|
||||||
setLoading,
|
setLoading,
|
||||||
setLoadingMessage,
|
setLoadingMessage,
|
||||||
showTooltip,
|
showTooltip,
|
||||||
@@ -1032,22 +1033,9 @@ function updateBGPHud(bgpResult) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const bgpCountEl = document.getElementById("bgp-anomaly-count");
|
setEarthStatValue("bgp-anomaly-count", `${bgpResult.totalCount} 起`);
|
||||||
if (bgpCountEl) {
|
setEarthStatValue("bgp-collector-count", `${bgpResult.collectorCount} 个`);
|
||||||
bgpCountEl.textContent = `${bgpResult.totalCount} 起`;
|
setEarthStatValue("bgp-status-summary", getBGPStatusText(bgpResult));
|
||||||
}
|
|
||||||
|
|
||||||
const bgpCollectorEl = document.getElementById("bgp-collector-count");
|
|
||||||
if (bgpCollectorEl) {
|
|
||||||
bgpCollectorEl.textContent = `${bgpResult.collectorCount} 个`;
|
|
||||||
}
|
|
||||||
|
|
||||||
["bgp-status-summary", "mobile-bgp-status-summary"].forEach((id) => {
|
|
||||||
const bgpStatusEl = document.getElementById(id);
|
|
||||||
if (bgpStatusEl) {
|
|
||||||
bgpStatusEl.textContent = getBGPStatusText(bgpResult);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function ensureCruiseConnector() {
|
function ensureCruiseConnector() {
|
||||||
@@ -1410,12 +1398,7 @@ function updateSatelliteToggleUi(enabled, satelliteCount = getSatelliteCount())
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
["satellite-count", "mobile-satellite-count"].forEach((id) => {
|
setEarthStatValue("satellite-count", `${satelliteCount} 颗`);
|
||||||
const satelliteCountEl = document.getElementById(id);
|
|
||||||
if (satelliteCountEl) {
|
|
||||||
satelliteCountEl.textContent = `${satelliteCount} 颗`;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateCableToggleUi(enabled) {
|
function updateCableToggleUi(enabled) {
|
||||||
@@ -1428,15 +1411,8 @@ function updateCableToggleUi(enabled) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const cableCountEl = document.getElementById("cable-count");
|
setEarthStatValue("cable-count", `${getCableLines().length}个`);
|
||||||
if (cableCountEl) {
|
setEarthStatValue("landing-point-count", `${getLandingPoints().length}个`);
|
||||||
cableCountEl.textContent = `${getCableLines().length}个`;
|
|
||||||
}
|
|
||||||
|
|
||||||
const landingPointCountEl = document.getElementById("landing-point-count");
|
|
||||||
if (landingPointCountEl) {
|
|
||||||
landingPointCountEl.textContent = `${getLandingPoints().length}个`;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function ensureCablesEnabled() {
|
async function ensureCablesEnabled() {
|
||||||
@@ -1553,8 +1529,7 @@ function disableSatellites() {
|
|||||||
function updateStatsSummary() {
|
function updateStatsSummary() {
|
||||||
updateEarthStats({
|
updateEarthStats({
|
||||||
cableCount: getCableLines().length,
|
cableCount: getCableLines().length,
|
||||||
landingPointCount:
|
landingPointCount: getLandingPoints().length,
|
||||||
document.getElementById("landing-point-count")?.textContent || 0,
|
|
||||||
bgpAnomalyCount: `${getBGPCount()} 条`,
|
bgpAnomalyCount: `${getBGPCount()} 条`,
|
||||||
bgpCollectorCount: `${getBGPCollectorCount()} 个`,
|
bgpCollectorCount: `${getBGPCollectorCount()} 个`,
|
||||||
bgpStatusSummary: getBGPStatusSummary(),
|
bgpStatusSummary: getBGPStatusSummary(),
|
||||||
|
|||||||
@@ -19,10 +19,15 @@ function getElement(id) {
|
|||||||
return document.getElementById(id);
|
return document.getElementById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
function setTextTargets(ids, value) {
|
function getEarthStatTargets(statKey) {
|
||||||
ids.forEach((id) => {
|
return Array.from(
|
||||||
const element = getElement(id);
|
document.querySelectorAll(`[data-earth-stat="${statKey}"]`),
|
||||||
if (element) {
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function setEarthStatValue(statKey, value) {
|
||||||
|
getEarthStatTargets(statKey).forEach((element) => {
|
||||||
|
if (element instanceof HTMLElement) {
|
||||||
element.textContent = value;
|
element.textContent = value;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -180,13 +185,13 @@ export function updateZoomDisplay(zoomLevel, distance) {
|
|||||||
|
|
||||||
// Update earth stats
|
// Update earth stats
|
||||||
export function updateEarthStats(stats) {
|
export function updateEarthStats(stats) {
|
||||||
setTextTargets(["cable-count", "mobile-cable-count"], String(stats.cableCount || 0));
|
setEarthStatValue("cable-count", String(stats.cableCount || 0));
|
||||||
setTextTargets(["landing-point-count", "mobile-landing-point-count"], String(stats.landingPointCount || 0));
|
setEarthStatValue("landing-point-count", String(stats.landingPointCount || 0));
|
||||||
setTextTargets(["bgp-anomaly-count", "mobile-bgp-anomaly-count"], String(stats.bgpAnomalyCount || 0));
|
setEarthStatValue("bgp-anomaly-count", String(stats.bgpAnomalyCount || 0));
|
||||||
setTextTargets(["bgp-collector-count"], String(stats.bgpCollectorCount || 0));
|
setEarthStatValue("bgp-collector-count", String(stats.bgpCollectorCount || 0));
|
||||||
setTextTargets(["bgp-status-summary", "mobile-bgp-status-summary"], stats.bgpStatusSummary || "-");
|
setEarthStatValue("bgp-status-summary", stats.bgpStatusSummary || "-");
|
||||||
setTextTargets(["terrain-status"], stats.terrainOn ? "开启" : "关闭");
|
setEarthStatValue("terrain-status", stats.terrainOn ? "开启" : "关闭");
|
||||||
setTextTargets(["texture-quality"], stats.textureQuality || "8K 卫星图");
|
setEarthStatValue("texture-quality", stats.textureQuality || "8K 卫星图");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show/hide loading via status message
|
// Show/hide loading via status message
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "planet"
|
name = "planet"
|
||||||
version = "0.35.0"
|
version = "0.35.1"
|
||||||
description = "智能星球计划 - 态势感知系统"
|
description = "智能星球计划 - 态势感知系统"
|
||||||
requires-python = ">=3.14"
|
requires-python = ">=3.14"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
|||||||
Reference in New Issue
Block a user