feat: 优化设置布局并支持管理端地址切换 (#130)
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user