Мой ИТИ ХГУ — это официальное мобильное приложение для студентов и преподавателей Инженерно-технологического института Хакасского государственного университета им. Н. Ф. Катанова. Приложение создано для того, чтобы сделать доступ к расписанию, новостям и навигации по университету максимально удобным и быстрым.
- Расписание: Просмотр расписания занятий по группам.
- Режимы: Дневной и недельный просмотр.
- Первокурснику: Специальный раздел с полезной информацией, ссылками и гайдами.
- Персональное расписание: Поиск по ФИО.
- Детализация: Отображение групп для каждой пары.
- Навигация: Удобный просмотр расписания на неделю.
- Офлайн-доступ: Кэширование расписания и новостей.
- Новости: Актуальные события университета.
- Карта: Интерактивная схема корпусов.
- Персонализация: Темы (светлая/тёмная) и цветовые акценты.
- Уведомления: Оповещения об изменениях и важных новостях.
Проект построен с использованием современных технологий:
- Framework: React Native
- Platform: Expo
- Language: JavaScript (ES6+)
- Navigation: Expo Router (File-based routing)
flowchart TD
A0["Application Core & Global State
"]
A1["API Communication & Caching
"]
A2["User Interface Components
"]
A3["Schedule Management Logic
"]
A4["Notifications & Background Tasks
"]
A5["Theming & Visual Customization
"]
A6["Campus Map & Building Data
"]
A0 -- "Configures styling" --> A5
A0 -- "Initializes notifications" --> A4
A0 -- "Displays screens" --> A2
A1 -- "Accesses app settings" --> A0
A2 -- "Updates global settings" --> A0
A2 -- "Interacts with logic" --> A3
A2 -- "Requests news data" --> A1
A3 -- "Fetches schedule data" --> A1
A3 -- "Schedules lesson alerts" --> A4
A4 -- "Retrieves news updates" --> A1
A4 -- "Persists notification settings" --> A0
A5 -- "Applies visual themes" --> A2
A6 -- "Provides map data" --> A2
sequenceDiagram
participant UIComponent["UI Component (e.g. ScheduleScreen)"]
participant UseHook["useScheduleLogic (Brain)"]
participant ApiService["ApiService (Data Retriever)"]
participant NetInfo["NetInfo (Network Status)"]
participant AsyncStorage["AsyncStorage (Local Cache)"]
participant RemoteServer["University API Server"]
UIComponent->>UseHook: Needs schedule data (group, date)
UseHook->>ApiService: Calls getSchedule(group, date)
ApiService->>NetInfo: Checks internet connection
NetInfo-->>ApiService: Returns isOnline (true/false)
alt Cached Data Available & Valid
ApiService->>AsyncStorage: Checks for schedule data in cache
AsyncStorage-->>ApiService: Returns valid cached data
ApiService-->>UseHook: Returns cached data
UseHook-->>UIComponent: Displays cached schedule
else No Valid Cache OR Offline
ApiService->>AsyncStorage: Checks for *any* cached data (even stale)
AsyncStorage-->>ApiService: Returns stale data (if any) or null
alt Is Online & No Valid Cache
ApiService->>RemoteServer: Requests latest schedule data
RemoteServer-->>ApiService: Returns fresh schedule data
ApiService->>AsyncStorage: Saves fresh data to cache
AsyncStorage-->>ApiService: Confirms save
ApiService-->>UseHook: Returns fresh data
UseHook-->>UIComponent: Displays fresh schedule
else Is Offline & Stale Cache Available
ApiService-->>UseHook: Returns stale cached data (with 'offline' note)
UseHook-->>UIComponent: Displays stale schedule
else Is Offline & No Cache At All
ApiService--xUseHook: Throws 'NO_INTERNET' error
UseHook--xUIComponent: Shows 'No Internet' message
end
end
sequenceDiagram
participant User
participant App["App.js (Setup)"]
participant backgroundService["backgroundService.js"]
participant notificationService["notificationService.js"]
participant ApiService["ApiService (Data)"]
participant Cache["Cache (last_notified_news)"]
App->>notificationService: Initializes permissions
App->>backgroundService: Registers BACKGROUND_NEWS_CHECK task
Note over App: App goes to background or is closed
User->>backgroundService: OS triggers BACKGROUND_NEWS_CHECK periodically
backgroundService->>notificationService: Calls getNotificationSettings()
notificationService-->>backgroundService: Returns news notification enabled (true)
backgroundService->>ApiService: Calls getNews()
ApiService-->>backgroundService: Returns latest news data
backgroundService->>notificationService: Calls checkForNewNews(latestNews)
notificationService->>Cache: Gets 'last_notified_news'
Cache-->>notificationService: Returns previous news or null
notificationService->>notificationService: Compares latestNews with previous news
Note over notificationService: Finds truly new news
notificationService->>notificationService: Calls showNewsNotification(newNews)
notificationService->>User: Sends "Новая новость" notification
notificationService->>Cache: Saves latestNews as 'last_notified_news'
- Node.js
- npm
- Git
-
Склонируйте репозиторий
git clone https://github.com/PRO100BYTE/MyKHSU.git cd MyKHSU -
Установите зависимости
npm install
-
Запустите сервер разработки
npx expo start
В результате, вы получите варианты запуска приложения в:
Для начала нужно создать prebuild:
npx expo prebuildЗатем выполните одну из команд:
# APK (Release)
npx eas build --platform android --profile release-apk --local
# AAB (Google Play)
npx eas build --platform android --profile release --local
# Development APK
npx eas build --platform android --profile development --localWarning
Для локальной сборки под Android требуется Linux или macOS.
Note
Комментарий TheDayG0ne: Лично я для сборки приложения использую виртуальную машину с ОС Ubuntu Server 24.04. В качестве окружения устанавливал git, nodejs, jdk, а также android-sdk.
Для начала нужно создать prebuild:
npx expo prebuildЗатем выполните одну из команд:
# Release (IPA)
npx eas build --platform ios --profile release --local
# Development (Device)
npx eas build --platform ios --profile development --localWarning
Для локальной сборки под iOS требуется macOS с установленным Xcode.
Мы приветствуем вклад сообщества! Пожалуйста, ознакомьтесь с CONTRIBUTING.md и CODE_OF_CONDUCT.md перед началом работы.
Этот проект распространяется под лицензией LGPL v3. Подробнее см. в файле LICENSE.md.