Factorizer/Cluster ERP WikiCluster ERP English
Ana sayfa / Karar kayıtları

Açıklama

Sunucu tarafı arayüz durumu

Bir Cluster ERP kullanıcısının yerleşiminin sunucuda hesap başına saklandığı, cihaz tercihlerinin tarayıcıda veya masaüstü ayarlarında kaldığı kuralın karar kaydı.

Durum: Kabul edildi; projenin yazılı mühendislik kurallarında belirtilir. Bu kayıt Cluster ERP'nin arayüz durumunu nerede tuttuğunu kapsar. Kullanıcının sahip olduğu düzen (ana ekran, dock, bileşenler) sunucudaki kullanıcı hesabına aittir; tek bir cihazın tercihleri (tema, dil, saat dilimi, erişilebilirlik, yüzen düğme konumu) o cihazda kalır. İstemci ve rotalar kullanıcı arayüz durumu sayfasında açıklanır.

Bağlam

İstemci modülü kurala yol açan sorunu belirtir: ana ekran yerleşimi bir zamanlar yalnız tarayıcının yerel deposunda yaşıyordu; bu yüzden "silently differed per browser, per device and even per host name" ve temizlenen bir önbellek sıfırlama gibi görünüyordu (webapp/js/ui-state.js:1-7). Model belge dizesi amacı belirtir: düzen kişiyi cihazlar ve tarayıcılar arasında izler ve yeniden başlatmaya, temizlenen önbelleğe veya farklı bir ana makine adına dayanır (src/cluster_erp/modules/auth/ui_state/models.py:13-21). Projenin yazılı mühendislik kuralları ayrıca tarayıcı testlerinin arayüz durumu bekçisini kullanmasını ister.

Karar

  • Kullanıcı başına yerleşim değerleri, kullanıcı ve anahtar başına bir canlı satırla auth_user_ui_state tablosunda durur (src/cluster_erp/modules/auth/ui_state/models.py:23-35).
  • GET /api/v1/auth/ui-state ve PUT /api/v1/auth/ui-state/{key} rotaları oturum açmış kullanıcının kendi değerlerini okur ve yazar. Kullanıcı kimliği istekten değil, belirteçten gelir (src/cluster_erp/modules/auth/ui_state/routes.py:15-39, src/cluster_erp/modules/auth/module.py:58, src/cluster_erp/modules/auth/module.py:68).
  • Cihaz tercihleri localStorage içinde kalır: tema ve saat dilimi (webapp/js/prefs.js:5-6), dil (webapp/js/i18n.js:9), erişilebilirlik (webapp/js/a11y.js:33) ve yüzen düğme konumu (webapp/js/home.js:2965). Masaüstü istemci pencere ve bölme yerleşimini QSettings içinde tutar (src/cluster_erp/desktop/core/settings_store.py:10).

Sıra şeması web uygulamasında bir yerleşim değişikliğini gösterir.

sequenceDiagram
 participant UI as ana ekran
 participant St as ui-state.js
 participant API as auth ui-state rotaları
 participant Svc as UiStateService
 UI->>St: saveUiState(key, value)
 St->>St: kuyruğa al, 600 ms bekle
 St->>API: keepalive ile PUT /auth/ui-state/key
 API->>Svc: put(user.id, key, value)
 Svc->>Svc: canlı satırı ekle veya güncelle

Düzyazıyla: saveUiState yerel önbelleği günceller, değeri kuyruğa alır ve 600 ms'lik bir zamanlayıcı başlatır; böylece bir sürükleme sırasındaki birçok kayıt tek bir yazma olur (webapp/js/ui-state.js:68-73). flush, kuyruktaki her anahtar için keepalive ile bir PUT gönderir ve sayfa gizlendiğinde veya kapandığında da kuyruk boşaltılır (webapp/js/ui-state.js:41-65). Servis o kullanıcı ve anahtarın canlı satırını ekler veya günceller (src/cluster_erp/modules/auth/ui_state/services.py:30-44).

Sonuçlar

  • Bir kişi başka bir kişinin yerleşimini okuyamaz ve üzerine yazamaz; rotaları yalnız kimlik doğrulama korur (src/cluster_erp/modules/auth/ui_state/routes.py:15-18).
  • Bir değer 256 KiB JSON ile (src/cluster_erp/modules/auth/ui_state/schemas.py:8-29), bir anahtar 60 karakterle sınırlıdır (src/cluster_erp/modules/auth/ui_state/routes.py:32-33).
  • Her cihaz sınıfı kendi ana ekran düzenini kendi anahtarı altında tutar, örneğin springboard_phone (webapp/js/device-class.js:22-26).
  • İlk okuma başarısız olduğunda istemci düzeni silmek yerine yerel kopyasını korur (webapp/js/ui-state.js:29-34).
  • Tarayıcı testleri gerçek bir hesabın sunucu tarafı durumunu değiştirir; bu yüzden onu geri yükleyen bir bekçiye ihtiyaç duyar.

Kodun uyguladığı yerler

Mekanizma Neyi denetler Kaynak
UiStateService Her okuma ve yazma tek bir kullanıcı kimliğiyle sınırlıdır src/cluster_erp/modules/auth/ui_state/services.py:12-44
UiStateWrite._bounded Saklanan değer JSON'dur ve en fazla 256 KiB'tır src/cluster_erp/modules/auth/ui_state/schemas.py:13-29
guardUiState Tarayıcı süitleri test hesabıyla, bilinen bir tahtada çalışır ve özgün durumu geri yükler web-client/_ui_state_guard.mjs:114-195
test_board_touching_suites_use_the_ui_state_guard Yerleşime dokunan her süit bekçiyi kullanır tests/test_e2e_db_isolation.py:177-200

İlgili sayfalar


92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.

Doğrulanan commit 92f8051 · 2026-11-13