release: bump version to 0.35.1

This commit is contained in:
linkong
2026-04-22 18:04:54 +08:00
parent 439a512148
commit 6a5f9f7ad4
11 changed files with 62 additions and 80 deletions

View File

@@ -1 +1 @@
0.35.0 0.35.1

View File

@@ -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

View File

@@ -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 合并采集源后默认频道消失的问题 |

View File

@@ -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": {

View File

@@ -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>

View File

@@ -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");

View File

@@ -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) {

View File

@@ -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(),

View File

@@ -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

View File

@@ -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 = [

2
uv.lock generated
View File

@@ -475,7 +475,7 @@ wheels = [
[[package]] [[package]]
name = "planet" name = "planet"
version = "0.35.0" version = "0.35.1"
source = { virtual = "." } source = { virtual = "." }
dependencies = [ dependencies = [
{ name = "aiofiles" }, { name = "aiofiles" },