- Клиентское 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 открыт для входящих подключений
- Создайте базу данных:
CREATE DATABASE studentify;- Создайте таблицы:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INTEGER NOT NULL CHECK,
group_name VARCHAR(50) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
tokens INTEGER NOT NULL
);
CREATE TABLE teachers (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INTEGER NOT NULL CHECK,
email VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL
);Создайте файл application.yaml в директории resources:
ktor:
application:
modules: [com.studentify.ApplicationKt.module]
deployment:
port: 8080
host: 0.0.0.0
postgres:
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-дневным сроком действия
- Автоматическая валидация входных данных
- Разделение прав доступа по ролям