This readme presented in Russian π·πΊ and EnglishπΊπΈ version.
ΠΠΏΠ΅ΡΠ°ΡΠΎΡ18 β ΡΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ, ΠΏΡΠΈΠ·Π²Π°Π½Π½Π°Ρ ΡΠΏΡΠΎΡΡΠΈΡΡ ΠΈΡ ΡΠ°Π±ΠΎΡΡ, ΠΏΠΎΠ²ΡΡΠΈΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π°ΡΠ²ΠΎΠΊ ΠΈ Ρ.Π΄.
Π― ΠΠ»Π΅ΠΊΡΠ΅ΠΉ, ΠΎΡΠ½ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈ Π°Π²ΡΠΎΡ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°. Π― Π·Π°Π½ΠΈΠΌΠ°ΡΡΡ ΡΡΠΎΠ½ΡΠΎΠΌ. ΠΠΌΠ΅ΡΡΠ΅ ΡΠΎ ΠΌΠ½ΠΎΠΉ Π½Π°Π΄ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠΎΠΎΡΠ½ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΎΠ½ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ Π±ΡΠΊΠΎΠΌ.
ΠΠ°ΠΌ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ ΡΠ΄Π΅Π»Π°ΡΡ Π°Π΄Π΅ΠΊΠ²Π°ΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ΅, ΠΏΡΠΎΡΡΠΎΠ΅ Π² ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠΈ ΠΈ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠΈ, ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½ΠΎ ΠΏΠΎΠ½ΡΡΠ½ΠΎΠ΅, Π±ΡΡΡΡΠΎΠ΅. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π»ΠΈΡΠ½ΠΎ ΠΌΠ½Π΅, ΠΊΠ°ΠΊ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ, Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π½Π°ΠΏΠΈΡΠ°ΡΡ Ρ ΠΎΡΠΎΡΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Π½Π΅ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡΠΎΠΌ, Π° ΠΏΡΠΎΠ΅ΠΊΡ, ΠΊΠΎΠ΄ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΈ, ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ, ΠΌΠ΅Π½ΡΡΡ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΠΎ. Π ΡΠ΅ΠΌ-ΡΠΎ Π½Π°ΠΌ ΡΠ΄Π°Π»ΠΎΡΡ Π΄ΠΎΠ±ΠΈΡΡΡΡ ΡΡΠΎΠ³ΠΎ. ΠΠΎ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ΅ΠΊΡ Π½Π΅ Ρ Π²Π°ΡΠ°Π΅Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΠΎΡΡΠΎΠΌΡ, ΠΌΡ ΠΏΡΠΈΠ½ΡΠ»ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠ΄Π°ΡΡ ΠΏΡΠΎΠ΅ΠΊΡ Π² ΠΌΠ°ΡΡΡ. ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ, ΠΊΡΠΎ-ΡΠΎ ΡΠΌΠΎΠΆΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΈΠ»ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ Π»ΡΡΡΠ΅.
Π ΡΡΠΎΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ ΡΠ°Π±ΠΎΡΠ°Ρ Π²Π΅ΡΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ· ΡΡΠΎΡΠΎΠ² ΠΏΠΎΠΊΠ° ΡΠ±ΡΠ°Π½Ρ. ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ ΠΊΡΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ ΠΈ ΠΊΠ°ΠΊ ΡΠ³ΠΎΠ΄Π½ΠΎ. Π‘ΡΠΎΠΈΡ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π΄Π°Π½Π½ΡΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ², ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ ΠΏΠΎΠΊΠ°, Π΅Π³ΠΎ Π½Π΅Π»ΡΠ·Ρ Π²Π·ΡΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ "ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ".
ΠΡΠ»ΠΈ Ρ ΠΎΡΠ΅ΡΡΡ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ°Π±ΠΎΡΡΡ Π²Π΅Π±-Π²Π΅ΡΡΠΈΡ ΠΊΠ°Π±ΠΈΠ½Π΅ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° - ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡΠ΅ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅. ΠΠΎΠ³ΠΈΠ½: operator@mail.ru, ΠΏΠ°ΡΠΎΠ»Ρ: operator.
ΠΠ°ΡΡ Π²Π΅ΡΡΠΈΡ ΠΌΡ ΠΎΡΡΠ°Π²ΠΈΠΌ ΡΠ°Π±ΠΎΡΠ΅ΠΉ, ΠΏΠΎΡΡΠΎΠΌΡ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Π²Ρ Π½Π΅ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ ΠΊΠ»ΡΡΠ΅ΠΉ API ΠΈ ΠΏΡΠΎΡΠ΅ΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ.
ΠΠ΅ΡΡ UI ΠΎΡΡΠΈΡΠΎΠ²Π°Π½ Π² ΡΠΈΠ³ΠΌΠ΅ ΠΈ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅. ΠΡΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ UI ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π±ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°Π½Ρ (ΡΠ±ΡΠ°Π½Ρ) Π² Ρ ΠΎΠ΄Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠΊΡΠ°Π½ΠΎΠ² Π² ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Π½Π΅ ΡΡΠ°Π»ΠΈ Π΄Π΅Π»Π°ΡΡ (ΠΏΠΎ ΡΠ°Π·Π½ΡΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ). ΠΠΎ ΡΡΡΠ»ΠΊΠ΅ Π²ΡΠ»ΠΎΠΆΠ΅Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²Π΅ΡΡΠΈΡ UI ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ»Π° ΠΌΠ½ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π°. ΠΠ΅ΡΡΠΈΡ UI Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΆΠΈΡΠ΅Π»Π΅ΠΉ Π½Π΅ Π±ΡΠ»Π° Π·Π°ΠΊΠ°Π·Π°Π½Π° Π΄Π»Ρ ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ Π² ΡΠ΅Π»ΡΡ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΠΈ Π±ΡΠ΄ΠΆΠ΅ΡΠ°. Π― ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π» ΠΏΡΠΎΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π΅Ρ ΠΏΠΎ ΠΎΠ±ΡΠ°Π·Ρ ΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΠΈΡ ΠΎΠ±ΡΠ΅ΠΉ ΡΠ΅ΠΌΡ. Π ΡΠ΅Π»ΠΎΠΌ, Π²ΡΠ΅ UI ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π΅ΡΡΡ, ΠΈ Π΄ΠΎΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΆΠΈΡΠ΅Π»Π΅ΠΉ Π½Π΅ ΡΠΎΡΡΠ°Π²ΠΈΡ ΡΡΡΠ΄Π°.
ΠΡΠ»ΠΈ Π²Π°ΠΌ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ ΠΏΠΎΡΡΠ°ΡΡΠ²ΠΎΠ²Π°ΡΡ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅, ΠΈΠ»ΠΈ Π²Π½Π΅Π΄ΡΠΈΡΡ Π΅Π³ΠΎ, ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠ°ΡΡ ΠΏΡΠΎΠ΅ΠΊΡ, ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ²ΡΠ·Π°ΡΡΡΡ Ρ Π½Π°ΠΌΠΈ ΡΠ΅ΡΠ΅Π·:
Π‘ΡΡΠΊ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΡΡ ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ:
- ΡΡΠΎΠ½Ρ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Flutter, ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠ°ΡΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² Π½Π°ΠΏΠΈΡΠ°Π½Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ BloC, Π° ΡΠ°ΡΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ MobX;
- Π±ΡΠΊ ΠΏΠΎΠ΄Π½ΡΡ Π½Π° VPS, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡ Parse Server Π½Π° CentOS;
- Π±ΠΎΡ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° Dart ΠΈ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Π’Π΅Π»Π΅Π³ΡΠ°ΠΌΠΌΠ°, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ Π½Π° VPS ΡΠ΅ΡΠ΅Π· Docker;
- Π΄Π»Ρ ΠΏΡΡ-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Google Firebase - Cloud Messaging, ΠΏΠΎΡΡΠΎΠΌΡ, Π΅ΡΠ»ΠΈ Π±ΡΠ΄Π΅ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π°Π΄ ΡΠ²ΠΎΠ΅ΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ ΠΠΏΠ΅ΡΠ°ΡΠΎΡΠ°18, Π½Π΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ ΡΠ°ΠΉΠ» ΠΎΡ Firebase, ΡΠ°ΠΊ ΠΆΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Fierbase Π² ΠΏΡΠΎΠ΅ΠΊΡΠ΅;
- ΡΠ΅Π³ΠΈΡΡΡΠΈΠ°ΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° Parse Server;
Π ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Π²Ρ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ 4 ΠΏΠ°ΠΏΠΊΠΈ:
- o18_client - ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΆΠΈΡΠ΅Π»Π΅ΠΉ;
- o18_staff - ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠΎΠ² Π£Π;
- o18_web - Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°;
- bot_app - ΡΠ΅Π»Π΅Π³ΡΠ°ΠΌΠΌ Π±ΠΎΡ Π΄Π»Ρ ΠΆΠΈΡΠ΅Π»Π΅ΠΉ;
- CONF ΠΈ parse_server - ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ Π΄Π»Ρ Parse Server.
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΆΠΈΡΠ΅Π»Π΅ΠΉ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°Π½ΠΎ Π½Π° Π²ΡΠΎΡΡΡ Π²Π΅ΡΡΠΈΡ (ΡΡΠ°ΡΡΠΉ UI) Π½Π΅ Ρ Π²Π°ΡΠ°Π΅Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
Π ΡΠ°ΠΌΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π° ΡΠΎΠ»Π΅Π²Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄ΠΎΡΡΡΠΏΠ°. Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠΎΠ»ΠΈ:
- ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ;
- ΠΊΠ»ΠΈΠ΅Π½Ρ (ΠΎΠ½ ΠΆΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΈΠΊ, ΠΎΠ½ ΠΆΠ΅ ΠΆΠΈΡΠ΅Π»Ρ);
- ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊ Π£Π.
Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΠΠΏΠ΅ΡΠ°ΡΠΎΡΠ°18 ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ.
-
ΠΠ΅Π± ΠΊΠ°Π±ΠΈΠ½Π΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°
-
ΠΠΎΠ΄ΡΠ»Ρ Π·Π°ΡΠ²ΠΊΠΈ
Π ΠΌΠΎΠ΄ΡΠ»Π΅ ΠΠ°ΡΠ²ΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ/ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π°ΡΠ²ΠΊΠΈ, Π½Π°Π·Π½Π°ΡΠ°ΡΡ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π΅ΠΉ, ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΏΡΡ-ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ Π·Π°ΡΠ²ΠΈΡΠ΅Π»ΡΠΌ, ΠΏΠ΅ΡΠ°ΡΠ°ΡΡ Π½Π°ΡΡΠ΄-Π·Π°Π΄Π°Π½ΠΈΡ, ΠΏΠ΅ΡΠ°ΡΠ°ΡΡ ΡΠ°Π·Π½ΡΠ΅ ΠΆΡΡΠ½Π°Π»Ρ ΠΏΠΎ Π·Π°ΡΠ²ΠΊΠ°ΠΌ.
-
ΠΠΎΠ΄ΡΠ»Ρ ΠΠΎΠΌΠ°
ΠΠΎΠ΄ΡΠ»Ρ ΠΠΎΠΌΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²Π΅ΡΡΠΈ Π±Π°Π·Ρ Π΄ΠΎΠΌΠΎΠ², ΠΊΠ°ΡΡΠΎΡΠΊΡ Π΄ΠΎΠΌΠ°, ΠΏΠ΅ΡΠ΅ΡΠ΅Π½Ρ ΠΊΠ²Π°ΡΡΠΈΡ, Π»ΠΈΡΠ΅Π²ΡΡ ΡΡΠ΅ΡΠΎΠ², ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΈΠΊΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΈΠΊΠ°ΠΌ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ°.
-
ΠΠΎΠ΄ΡΠ»Ρ Π‘ΡΠ΅ΡΡΠΈΠΊΠΈ
ΠΠΎΠ΄ΡΠ»Ρ Π‘ΡΠ΅ΡΡΠΈΠΊΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π»ΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΈΠΊΠΈ ΡΠ΅ΡΠ΅Π· ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
-
ΠΠΎΠ΄ΡΠ»Ρ ΠΠΎΠ½ΡΡΠ°Π³Π΅Π½ΡΡ
ΠΠΎΠ΄ΡΠ»Ρ ΠΊΠΎΠ½ΡΡΠ°Π³Π΅Π½ΡΠΎΠ² Π΄Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²Π΅ΡΡΠΈ Π±Π°Π·Ρ ΠΊΠΎΠ½ΡΡΠ°Π³Π΅Π½ΡΠΎΠ² ΠΈ ΠΈΡ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠΎΠ² Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠΈΡΡΠ΅ΠΌΠ΅.
-
-
ΠΠΎΠ±ΠΈΠ»ΡΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ Π‘ΠΎΡΡΡΠ΄Π½ΠΈΠΊΠΎΠ²
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π·Π°ΡΠ²ΠΊΠΈ Π΄Π»Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠ΅ΡΠ°, Π·Π°ΠΊΡΡΠ²Π°ΡΡ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΡΡ Π·Π°ΡΠ²ΠΊΠΈ, ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎ Π½ΠΎΠ²ΡΡ Π·Π°ΡΠ²ΠΊΠ°Ρ ΠΈΠ»ΠΈ ΠΎΡ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π°.
-
ΠΠΎΠ±ΠΈΠ»ΡΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΠ»ΠΈΠ΅Π½ΡΠΎΠ²
Π ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΡ Π£Π, ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π·Π°ΡΠ²ΠΊΠΈ ΠΈ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΡΡΠ°ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΠΏΠΎΠ΄Π°Π²Π°ΡΡ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈΡ ΡΡΠ΅ΡΡΠΈΠΊΠΎΠ² ΠΈ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ Π±Π°Π»Π°Π½Ρ Π»ΠΈΡΠ΅Π²ΠΎΠ³ΠΎ ΡΡΠ΅ΡΠ° Π² ΠΏΡΠΎΡΠΈΠ»Π΅.
-
Telegram Π±ΠΎΡ Π΄Π»Ρ ΠΠ»ΠΈΠ΅Π½ΡΠΎΠ²
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ Π±ΠΎΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π°Π²Π°ΡΡ Π·Π°ΡΠ²ΠΊΠΈ Π² ΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π°Π²Π°ΡΡ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈΡ ΡΡΠ΅ΡΡΠΈΠΊΠΎΠ².
- Π‘Π½Π°ΡΠ°Π»Π° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΡ
.env
ΡΠ°ΠΉΠ», ΠΊΠΎΡΠΎΡΡΠΈΜ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ Π² ΠΏΠ°ΠΏΠΊΡ/assets
. ΠΡΠΎ ΡΠ°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΆΠ΅ΡΠΆΠ°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠ»ΡΡΠΈ:
// ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Parse Server
PARSE_APP_ID=your_app_id_from_parse_server
// ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΉ ΠΊΠ»ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Parse Server
CLIENT_KEY=your_client_key_from_parse_server
// REST API ΠΊΠ»ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Parse Server
REST_API_KEY=your_rest_api_key_from_parse_server
// URL ΡΠ΅ΡΠ²Π΅ΡΠ° Parse
PARSE_SERVER_URL=https://<your_parse_server_url>/parse/
// Π‘Π΅ΠΊΡΠ΅ΡΠ½ΡΠΈΜ ΠΊΠ»ΡΡ FCM
FCM_SERVER_KEY=your_fcm_server_key
FCM_URL=https://fcm.googleapis.com/fcm/send
- ΠΠ°Π»Π΅Π΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠ±ΠΎΡΠΊΡ web-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΠΏΠ΅ΡΠ°ΡΠΎΡ18. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅ Π² ΠΏΠ°ΠΏΠΊΡ o18_web ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
flutter clean
flutter pub get
flutter build web -t lib/main_development.dart
-
ΠΠΎΡΠ»Π΅ Π²ΡΠΎΠ»Π½Π΅Π½ΠΈΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΡΠ°ΠΈΜΠ»ΠΎΠ², ΡΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ ΡΡΠΈΡΡΡ ΠΈΠ·
assets/fonts
Π²build/web/assets/fonts
, ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π»Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΡΠΈΡΡΠΎΠ² ΠΏΡΠΈ ΠΏΠ΅ΡΠ°ΡΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΆΡΡΠ½Π°Π»ΠΎΠ² ΠΏΠΎ Π·Π°ΡΠ²ΠΊΠ°ΠΌ. -
Π‘ΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ ΡΠ°ΠΉΠ»
.env
ΠΈΠ·/assets
Π²build/web/assets
, ΠΈΠ½Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π·Π°ΠΏΡΡΡΠΈΡΡΡ ΠΈΠ·-Π·Π° ΠΎΡΡΡΡΡΡΠ²ΠΈΡ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΡ ΠΊΠ»ΡΡΠ΅ΠΉ. -
Π Π°Π·Π²Π΅ΡΠ½ΠΈΡΠ΅ Π½ΠΎΠ²ΡΡ ΡΠ±ΠΎΡΠΊΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ (Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΡΡΠΈΠ»ΠΈΡΡ rsync), Π²ΡΠΏΠΎΠ»Π½ΠΈΠ² ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΠ· ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°. ΠΠ²Π΅Π΄ΠΈΡΠ΅ ΠΏΠ°ΡΠΎΠ»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
root
, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΠΎΡΠ΅Π½.
rsync -rvzhe ssh build/web/* root@<your_parse_server_ip_address>:/var/www/operator18.ru
// ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΠΏΡΡΡ Π½Π° Π²Π°ΡΠ΅ΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΎΡ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΡΡΡ - /var/www/operator18.ru
ΠΠΎΠ±ΠΈΠ»ΡΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠ΅Π»ΠΎ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ/ΡΠΎΠ±ΠΈΡΠ°ΡΡ ΠΏΠΎ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΌΡ Π³Π°ΠΉΠ΄Ρ ΠΎΡ Flutter.
ΠΡΠΆΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅ ΠΏΠΎΠΌΠ΅Π½ΡΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΏΠ»Π°ΡΡΠΎΡΠΌ:
-
iOS
- Π·Π°ΠΏΡΡΡΠΈΡΡ Xcode ΠΈ ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡΡ ΡΠ²ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, Π° ΡΠ°ΠΊ ΠΆΠ΅ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ bundleId;
-
Android
- Π²ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΠΉ applicationId Π² ΡΠ»ΡΠ΄ΡΡΡΠΈΠ΅ ΠΌΠ΅ΡΡΠ°:
- android/app/build.gradle
- android/app/src/main/AndroidManifest.xml
- Π²ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΠΉ applicationId Π² ΡΠ»ΡΠ΄ΡΡΡΠΈΠ΅ ΠΌΠ΅ΡΡΠ°:
Operator 18 is an automation system for property management companies designed to simplify their work, enhance control over order execution, and more.
I'm Alexey, the founder and author of this project. I handle the frontend. I'm working on the project alongside another co-founder who manages the backend.
We aimed to create a solution that is adequate, high-quality, easy to maintain and deploy, intuitively understandable, and fast. As a developer, I wanted to build a system that is not a monolith but one where the code can be easily maintained and modularly changed if necessary. We partially achieved this goal, but we lack the time to fully implement the project.
Therefore, we have decided to release the project to the public. Perhaps someone can implement it or improve upon it.
In this repository, you'll find the latest working version of the project. The applications from app stores have been removed for now. Anyone can use and interact with the repository. It's worth noting that this repository is more intended for developers because, at least for now, it can't be easily set up and run "out of the box."
If you want to see the working web version of the operator's dashboard, follow this link. Login: operator@mail.ru, password: operator.
We will keep our version working, so you won't find API keys and other sensitive information in this repository.
The entire UI is designed in Figma and is available via this link. It's important to note that some UI elements were rewritten (removed) during development, and some screens in the mobile version were not created for various reasons. The link contains the latest version of the UI that I used. The UI version for the resident application was not ordered for drawing to save on the budget. I planned to create it in the same theme. In general, all UI elements are available, and completing the resident application should not be a problem.
If you are interested in participating in the project, implementing it, or supporting it, you can contact us through:
The technology stack used in the development includes:
- Frontend is built with Flutter, with some projects using the BloC architecture, and others using MobX.
- Backend is hosted on a VPS, running Parse Server on CentOS.
- The bot is written in Dart and is only for Telegram, running on a VPS through Docker.
- Google Firebase - Cloud Messaging is used for push notifications. So, if you work on your own version of Operator18, don't forget to add the Firebase config file and initialize Firebase in the project.
- User registration is handled by Parse Server.
In the repository, you will find four folders:
- o18_client - mobile application for residents.
- o18_staff - mobile application for property management company staff.
- o18_web - web application for the operator.
- bot_app - Telegram bot for residents.
- CONF and parse_server - configuration files for Parse Server.
The application for residents has not been updated to the second version (old UI) due to time constraints.
The system itself includes a role-based access model with the following roles:
- Operator.
- Client (also known as an owner or resident).
- Property management company staff.
Operator 18 has the following functionality.
-
Operator Web Dashboard
-
Requests Module
In the Requests module, the operator can create/edit requests, assign tasks to performers, send push notifications to applicants, print work orders, and print various journals related to requests.
-
Houses Module
The Houses module allows managing the database of houses, house profiles, lists of apartments, personal accounts, owners, and sending messages to all owners of a specific house.
-
Meters Module
The Meters module enables viewing readings submitted by owners through mobile applications.
-
Counterparties Module
The Counterparties module provides the ability to manage a database of counterparties and their employees, as well as register employees for access to the system.
-
-
Mobile Applications for Staff
The application allows viewing requests for a specific performer or technician, closing or rescheduling requests, and receiving notifications about new requests or messages from management.
-
Mobile Applications for Clients
In the application, clients can receive messages from the property management company, create requests, track the status of execution, submit meter readings, and monitor the balance of their personal account in their profile.
-
Telegram Bot for Clients
With the bot, clients can submit requests to the property management company and submit meter readings.
- First, prepare an
.env
file that should be placed in the/assets
folder. This file should contain the following keys:
// Parse Server Application ID
PARSE_APP_ID=your_app_id_from_parse_server
// Parse Server Client Key
CLIENT_KEY=your_client_key_from_parse_server
// Parse Server REST API Key
REST_API_KEY=your_rest_api_key_from_parse_server
// Parse Server URL
PARSE_SERVER_URL=https://<your_parse_server_url>/parse/
// Firebase Cloud Messaging Secret Key
FCM_SERVER_KEY=your_fcm_server_key
FCM_URL=https://fcm.googleapis.com/fcm/send
- Next, build the Operator 18 web application. To do this, open your terminal, navigate to the o18_web folder, and run the following commands:
flutter clean
flutter pub get
flutter build web -t lib/main_development.dart
-
After generating the files, copy the fonts from
assets/fonts
tobuild/web/assets/fonts
to ensure proper font rendering for printing various journals related to requests. -
Copy the
.env
file from/assets
tobuild/web/assets
. Otherwise, the application won't start due to missing secret keys. -
Deploy the new build to your server (I used the rsync utility) by running the following command in your terminal. Enter the
root
user's password when prompted.
rsync -rvzhe ssh build/web/* root@<your_parse_server_ip_address>:/var/www/operator18.ru
// The final path on your server may differ from the one specified here - /var/www/operator18.ru
You can confidently run/build the mobile applications following the official Flutter deployment guide.
You should also change the application identifier for the platforms:
-
iOS
- Open Xcode and assign your team to the project, and use a unique bundleId.
-
Android
- Update your applicationId in the following places:
- android/app/build.gradle
- android/app/src
- Update your applicationId in the following places: