- Клиентское Android-приложение: StudentService на GitHub
- Ktor Framework: Официальная документация
- Exposed ORM: GitHub репозиторий
- PostgreSQL: Официальная документация
- Язык: Kotlin 1.9.0
- Фреймворк: Ktor 2.3.5
- База данных: PostgreSQL 15+
- ORM: Exposed 0.61.0
- Аутентификация: JWT + BCrypt
- Логирование: Logback
- Сериализация: kotlinx.serialization
Сервер реализован по принципу чистой архитектуры с разделением на слои:
Android Client → Ktor Server (REST API)
├── Auth Layer (JWT)
├── Business Logic
└── PostgreSQL Database
- Ролевая модель (Студенты/Преподаватели)
- JWT-аутентификация
- Реализация внутренней "валюты" (токены)
- CRUD операции для управления студентами
- Автоматическая валидация данных
- Поддержка WebSockets для real-time обновлений
- Java 17+
- PostgreSQL 15+
- Порт 8080 открыт для входящих подключений
- Создайте базу данных:
CREATEDATABASEstudentify;- Создайте таблицы:
CREATETABLEstudents (
id SERIALPRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INTEGERNOT NULLCHECK,
group_name VARCHAR(50) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
tokens INTEGERNOT NULL
);
CREATETABLEteachers (
id SERIALPRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INTEGERNOT NULLCHECK,
email VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL
);Создайте файл application.yaml в директории resources:
ktor:
application:
modules: [com.studentify.ApplicationKt.module]deployment:
port: 8080host: 0.0.0.0postgres:
url: "jdbc:postgresql://localhost:5432/studentify"user: "your_username"password: "your_password"jwt:
secret: "your_strong_secret_here_at_least_32_chars"issuer: "studentify-server"audience: "studentify-app"realm: "Studentify API"./gradlew build
java -jar build/libs/studentify-server.jar| Метод | Endpoint | Описание |
|---|---|---|
| GET | / | Статус сервера |
| POST | /auth/register | Регистрация пользователя |
| POST | /auth/login | Авторизация |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /students | Список всех студентов |
| GET | /students/count | Количество студентов |
| GET | /students/name/{name} | Поиск студента по имени |
| GET | /students/group/{group} | Студенты по группе |
| GET | /student/me | Данные текущего студента |
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /teacher/me | Данные текущего преподавателя |
| POST | /students | Добавить нового студента |
| PUT | /students/{id} | Обновить данные студента |
| DELETE | /students/{id} | Удалить студента |
Если сервер запущен локально:
- Узнайте ваш публичный IP: whatismyip.com
- Настройте проброс портов на роутере:
- Внешний порт: 8080
- Внутренний IP: [IP вашего компьютера]
- Внутренний порт: 8080
- Или используйте ngrok для временного туннеля:
ngrok http 8080
- При разработке использовался BaseUrl адрес (и автор (я) может его открыть для теста)
https://modern-marmot-eminently.ngrok-free.app/
Если сервер на VPS:
- Убедитесь, что порт 8080 открыт в брандмауэре:
sudo ufw allow 8080/tcp
- Убедитесь, что порт 8080 открыт в брандмауэре:
- Регистрация студента:
curl -X POST http://<SERVER_IP>:8080/auth/register \
-H "Content-Type: application/json" \
-d '{ "name": "Иван Иванов", "age": 20, "email": "ivanov@edu.ru", "password": "securePass123", "role": "STUDENT", "group": "CS-101" }'- Авторизация:
curl -X POST http://<SERVER_IP>:8080/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "ivanov@edu.ru", "password": "securePass123"}'- Доступ к защищённому ресурсу (используйте токен из предыдущего ответа):
curl http://<SERVER_IP>:8080/student/me \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userId": 1,
"role": "STUDENT"
}{
"id": 1,
"name": "Иван Иванов",
"age": 20,
"group": "CS-101",
"email": "ivanov@edu.ru",
"password": "hashed_password",
"tokens": 150
}{
"error": "Only teachers can perform this action"
}- Все пароли хранятся в виде BCrypt-хешей
- Используются JWT-токены с 7-дневным сроком действия
- Автоматическая валидация входных данных
- Разделение прав доступа по ролям