feat: 优化设置布局并支持管理端地址切换 (#130)

This commit is contained in:
chengma
2026-08-11 09:24:04 +08:00
parent 4ede126f58
commit cd2889d76c
9 changed files with 347 additions and 47 deletions
+74 -12
View File
@@ -30,6 +30,7 @@ from .admin_gateway import (
ClientRegistrationGateway,
)
from .current_client_service import (
ADMIN_BASE_URL_KEY,
CurrentClientService,
generate_client_device_id,
)
@@ -46,7 +47,7 @@ DEVICE_ID_PLACEHOLDER = "待生成"
class CurrentClientSaveWorker(QObject):
"""在线程中先保存本地身份,再登记到 Admin。"""
localSaved = pyqtSignal(str, str)
localSaved = pyqtSignal(str, str, str)
localSaveFailed = pyqtSignal(str)
registrationSucceeded = pyqtSignal(str)
registrationFailed = pyqtSignal(str)
@@ -58,6 +59,7 @@ class CurrentClientSaveWorker(QObject):
gateway: Optional[ClientRegistrationGateway],
client_name: str,
capabilities: ClaimCapabilities,
admin_base_url: str,
gateway_error: str = "",
):
super().__init__()
@@ -65,6 +67,7 @@ class CurrentClientSaveWorker(QObject):
self._gateway = gateway
self._client_name = client_name
self._capabilities = capabilities
self._admin_base_url = admin_base_url
self._gateway_error = gateway_error
self._cancelled = False
@@ -77,12 +80,19 @@ class CurrentClientSaveWorker(QObject):
def run(self) -> None:
try:
try:
saved = self._service.save(self._client_name)
saved = self._service.save(
self._client_name,
self._admin_base_url,
)
except Exception as exc:
self.localSaveFailed.emit(str(exc) or "无法写入本地数据库")
return
self.localSaved.emit(saved.client_id, saved.client_name)
self.localSaved.emit(
saved.client_id,
saved.client_name,
self._admin_base_url,
)
if self._cancelled:
return
@@ -300,10 +310,11 @@ class SettingsPageEventBinder(QObject):
searchRequested = pyqtSignal()
convertWifiRequested = pyqtSignal(str)
currentDeviceSaveRequested = pyqtSignal(str, str)
currentDeviceSaveRequested = pyqtSignal(str, str, str)
saveRequested = pyqtSignal(str, str)
deleteRequested = pyqtSignal(str)
androidDeviceConfigurationChanged = pyqtSignal(str)
adminBaseUrlChanged = pyqtSignal(str)
def __init__(
self,
@@ -353,6 +364,7 @@ class SettingsPageEventBinder(QObject):
)
repository = settings_repository or SettingsRepository()
self._settings_repository = repository
self.updateEventBinder = UpdateUiEventBinder(
page,
repository,
@@ -365,6 +377,8 @@ class SettingsPageEventBinder(QObject):
repository
)
self._admin_gateway = admin_gateway
self._owns_admin_gateway = admin_gateway is None
self._pending_admin_gateway = None
self._gateway_error = ""
if self._admin_gateway is None:
base_url = repository.get("admin.base_url", DEFAULT_ADMIN_BASE_URL)
@@ -419,12 +433,20 @@ class SettingsPageEventBinder(QObject):
device_id = self._page.deviceIdInput.text().strip()
device_name = self._page.deviceNameInput.text().strip()
admin_base_url = self._page.adminBaseUrlInput.text().strip()
self._page.deviceNameInput.setText(device_name)
self.currentDeviceSaveRequested.emit(device_id, device_name)
self.currentDeviceSaveRequested.emit(
device_id,
device_name,
admin_base_url,
)
@pyqtSlot(str, str)
@pyqtSlot(str, str, str)
def _start_save_current_device(
self, _displayed_device_id: str, device_name: str
self,
_displayed_device_id: str,
device_name: str,
admin_base_url: str,
) -> None:
if (
self._closing
@@ -436,6 +458,15 @@ class SettingsPageEventBinder(QObject):
return
try:
timeout_value = self._settings_repository.get(
"admin.request_timeout_seconds", 3.0
)
timeout_seconds = float(timeout_value)
validated_gateway = HttpAdminGateway(
admin_base_url,
timeout_seconds=timeout_seconds,
)
normalized_base_url = admin_base_url.strip().rstrip("/")
device = self._selected_android_device()
purchase_mode = (
"live"
@@ -452,10 +483,19 @@ class SettingsPageEventBinder(QObject):
supported_types=supported_types,
purchase_mode=purchase_mode,
)
except ValueError as exc:
except (TypeError, ValueError) as exc:
self._page.set_current_device_status(f"保存失败:{exc}")
self._page.adminBaseUrlInput.setFocus()
return
pending_gateway = (
validated_gateway
if self._owns_admin_gateway
else self._admin_gateway
)
self._pending_admin_gateway = pending_gateway
self._page.set_admin_base_url(normalized_base_url)
self._current_device_busy = True
self._sync_button_state()
self._page.set_current_device_status("正在保存本地设备信息…")
@@ -463,10 +503,11 @@ class SettingsPageEventBinder(QObject):
thread = QThread(self)
worker = CurrentClientSaveWorker(
self._client_service,
self._admin_gateway,
pending_gateway,
device_name,
capabilities,
self._gateway_error,
normalized_base_url,
"",
)
worker.moveToThread(thread)
@@ -905,6 +946,15 @@ class SettingsPageEventBinder(QObject):
"""页面创建时恢复本地 Client 信息。"""
try:
base_url = self._settings_repository.get(
ADMIN_BASE_URL_KEY,
DEFAULT_ADMIN_BASE_URL,
)
displayed_base_url = (
base_url.strip()
if isinstance(base_url, str) and base_url.strip()
else DEFAULT_ADMIN_BASE_URL
)
saved = self._client_service.load()
except Exception as exc:
self._page.set_current_device_status(
@@ -912,6 +962,7 @@ class SettingsPageEventBinder(QObject):
)
return
self._page.set_admin_base_url(displayed_base_url)
self._page.set_client_info(saved.client_id, saved.client_name)
if saved.client_id:
self._page.set_current_device_status("本地设备信息已加载")
@@ -1144,11 +1195,20 @@ class SettingsPageEventBinder(QObject):
self._refresh_registration_after_android_setting = False
QTimer.singleShot(0, self._request_save_current_device)
@pyqtSlot(str, str)
def _on_local_saved(self, client_id: str, client_name: str) -> None:
@pyqtSlot(str, str, str)
def _on_local_saved(
self,
client_id: str,
client_name: str,
admin_base_url: str,
) -> None:
if self._closing:
return
self._page.set_client_info(client_id, client_name)
self._page.set_admin_base_url(admin_base_url)
self._admin_gateway = self._pending_admin_gateway
self._gateway_error = ""
self.adminBaseUrlChanged.emit(admin_base_url)
self._page.set_current_device_status(
"本地已保存,正在登记到 Admin…"
)
@@ -1158,6 +1218,7 @@ class SettingsPageEventBinder(QObject):
if self._closing:
return
self._page.set_current_device_status(f"本地保存失败:{message}")
self._pending_admin_gateway = None
@pyqtSlot(str)
def _on_registration_succeeded(self, _registered_at: str) -> None:
@@ -1178,6 +1239,7 @@ class SettingsPageEventBinder(QObject):
self._worker = None
self._thread = None
self._current_device_busy = False
self._pending_admin_gateway = None
if not self._closing:
self._sync_button_state()