Для запуска приложения требуется:
JDK 17(java -versionдолжен возвращать 17 версию)PostgreSQL(тестировалось на 14 версии)
Перед запуском нужно изменить конфигурацию под машину, на которой будет запускаться приложение.
application.ymlлежит вsrc/main/resources/application.ymlесли будете запускать через Intellij Idea.
Если запускаете как jar, нужно положить конфигурацию рядом и запускать по инструкции из блока Запуск.
В application.yml нужно указать следующие параметры:
application.hostпоменять на публичный адрес машины (localhost:8080 для отладки)spring.datasource.urlна адрес базы данныхspring.datasource.usernameиspring.datasource.passwordна соответствущие реквизиты базы данных
Открываем проект, скачиваем зависимости через Maven, билдим и запускаем.
Рядом с .jar кладем готовую конфигурацию и через консоль в папке с приложением вызываем:
java -jar {jar_name}.jar --spring.config.location=file:application.yml
Важно: Все параметры в запросах передаются в виде параметров пути, например
/some-path?parameter1=value1¶meter2=value2.
Либо, если указано что параметер передается прямо в пути, например, /some-path/{parameterValue}, то передается прямо в пути.
Создает первого админа. Доступно только если нет ни одного админа. Работает без авторизации.
Запрос:
POST /api/admin/create-first
Параметры:
username- логин админаpassword- пароль админа
Ответ:
{
"result": {
"success": boolean,
"message": string
}
}Авторизирует пользователя. После успешной авторизации в куки будет лежать токен, благодаря которому будет доступ к остальному функционалу
Запрос:
POST /login
Параметры:
username- логинpassword- пароль
Ответ: В ответ приходит html шаблон, для api он не нужен - можно игнорировать
Создает институт. Нужно делать заранее, если нужно отображение имени института. Лучше сразу создайте институт Радиотехнический факультет | РТФ | Мира, 32
Запрос:
POST /api/institutes/create
Параметры:
instituteFullName- полное название институтаinstituteShortName- аббревиатура институтаinstituteAddress- адрес института формата "улица, дом". Именно так, потому что так записано в модеусе
Ответ:
{
"result": {
"success": boolean,
"message": string
}
}Возвращает список существующих институтов.
Запрос:
GET /api/institutes/list
Ответ:
{
"institutesList": [
{
"instituteId": int,
"fullName": string,
"shortName": string,
"address": string
}
]
}Создает пользователей (преподователей) на основе переданных в файле данных. Возвращает список кредов созданных пользователей
Запрос:
POST /api/users/create-from-file
Параметры:
file- multipart текстовый файл. Полное ФИО преподавателей, списком, без знаков препинания, каждый с новой строки
Ответ:
{
"result": {
"success": boolean,
"message": string
},
"createdUsersFile": string, файл в кодировке base64
}Возвращает список всех пользователей
Запрос:
GET /api/users/list
Ответ:
{
"users": [
{
"username": string,
"role": string
}
]
}Обновление данных пользователя
Запрос:
POST /api/users/update
Параметры:
username- имя пользователя- *
password- пароль. Опционально - *
professorName- ФИО преподавателя. Опционально
Ответ:
{
"result": {
"success": boolean,
"message": string
}
}Удаление пользователя
Запрос:
POST /api/users/delete
Параметры:
username- имя пользователя
Ответ:
{
"result": {
"success": boolean,
"message": string
}
}Создает пользователя в базе
Запрос:
POST /api/users/create
Параметры:
username- логин пользователяpassword- пароль пользователяrole- роль(ADMIN,PROFESSOR)professorName- ФИО преподавателя. Обязательно, еслиrole=PROFESSOR
Ответ:
{
"result": {
"success": boolean,
"message": string
}
}Возвращает данные о текущем(авторизованном) преподавателе
Запрос:
GET /api/professors/current
Параметры:
from- дата "ОТ" для поиска пар. Форматyyyy-MM-ddto- дата "ДО" для поиска пар. Форматyyyy-MM-dd
Ответ:
{
"professorName": string,
"coursesList": [
{
"courseId": string,
"courseDetails": {
"courseName": string,
"instituteName": string,
"instituteAddress": string,
"professorsNames": string
}
}
],
"classSessionsList": [
{
"sessionId": string,
"status": string,
"courseId": string,
"courseDetails": {
"courseName": string,
"instituteName": string,
"instituteAddress": string,
"professorsNames": string
},
"roomName": string,
"sessionName": string,
"professorName": string,
"startDateTime": string,
"endDateTime": string,
"disableAfterTimestamp": string
}
]
}Выгружает в базу пары из модеуса текущего(авторизованном) преподавателе
Запрос:
GET /api/professors/update-sessions
Параметры:
from- дата "ОТ" для поиска пар. Форматyyyy-MM-ddto- дата "ДО" для поиска пар. Форматyyyy-MM-dd
Ответ:
Если операция успешна, то:
{
"professorName": string,
"classSessionsList": [
{
"sessionId": string,
"status": string,
"courseId": string,
"courseDetails": {
"courseName": string,
"instituteName": string,
"instituteAddress": string,
"professorsNames": string
},
"roomName": string,
"sessionName": string,
"professorName": string,
"startDateTime": string,
"endDateTime": string,
"disableAfterTimestamp": string
}
]
}Если при выгрузке произошла ошибка, то в ответе будет:
{
"result": {
"success": false,
"message": "Во время получения пар из модеуса произошла ошибка"
}
}Создает в базе новый предмет. Нужно, если предмета нет в модеусе
Запрос:
POST /api/courses/create
Параметры:
instituteId- id институтаcourseName- название предметаprofessorsNames- ФИО преподавателей предмета, через запятую
Ответ:
{
"result": {
"success": boolean,
"message": string
}
}Возвращает данные о предмете
Запрос:
GET /api/courses/find
Параметры:
courseId- id института
Ответ:
{
"result": {
"success": boolean,
"message": string
},
"courseDetails": {
"courseName": string,
"instituteName": string,
"instituteAddress": string,
"professorsNames": string
},
"classSessionsList": [
{
"sessionId": string,
"status": string,
"courseId": string,
"courseDetails": {
"courseName": string,
"instituteName": string,
"instituteAddress": string,
"professorsNames": string
},
"roomName": string,
"sessionName": string,
"professorName": string,
"startDateTime": string,
"endDateTime": string,
"disableAfterTimestamp": string
}
]
}Создание пары вручную. Нужно если пары нет в модеусе.
Запрос:
POST /api/sessions/create
Параметры:
courseId- id предметаprofessorName- фио ведущего парыstartSession- дата-время начала пары в форматеyyyy-MM-ddTHH:mm:ssendSession- дата-время окончания пары в форматеyyyy-MM-ddTHH:mm:ssroomName- номер кабинетаsessionName- название пары
Ответ:
{
"result": {
"success": boolean,
"message": string
}
}Возвращает данные о паре
Запрос:
GET /api/sessions/find
Параметры:
sessionId- id пары
Ответ:
{
"timerInfo": {
"message": string,
"isActive": boolean
},
"reviewUrl": string,
"sessionQR": string, jpg изображение в base64
"classSessionDate": string,
"classSession": {
"sessionId": string,
"status": string,
"courseId": string,
"courseDetails": {
"courseName": string,
"instituteName": string,
"instituteAddress": string,
"professorsNames": string
},
"roomName": string,
"sessionName": string,
"professorName": string,
"startDateTime": string,
"endDateTime": string,
"disableAfterTimestamp": string
}
}Запускает таймер для пары. Пока таймер работает, на пару можно отправить отзыв. После окончания таймера, отзыв оставить нельзя, только если снова не включить таймер.
Запрос:
POST /api/sessions/start-timer
Параметры:
sessionId- id парыtime- время на которое будет включен таймер в форматеHH:mm:ss
Ответ:
{
"result": {
"success": boolean,
"message": string
}
}Возвращает список отзывов, оставленных на пару
Запрос:
GET /api/sessions/reviews-list
Параметры:
sessionId- id пары
Ответ:
{
"result": {
"success": boolean,
"message": string
},
"reviewsList": [
{
"reviewId": string,
"sessionId": string,
"studentFullName": string,
"value": int,
"comment": string,
"timestamp": string
}
]
}Изменяет ФИО преподавателя, который будет вести пару
Запрос:
POST /api/sessions/change-professor
Параметры:
sessionId- id парыnewProfessor- ФИО нового ведущего
Ответ:
{
"result": {
"success": boolean,
"message": string
}
}Сохранение отзыва со стороны студента. Доступно только если включен таймер на паре
Запрос:
POST /api/reviews/save
Параметры:
sessionId- id парыstudentFullName- ФИО студентаreviewValue- оценка пары, целое значение от 0 до 127comment- комментарий
Ответ:
{
"result": {
"success": boolean,
"message": string
}
}Возвращает рейтинг институтов.
Запрос:
GET /api/rating/institutes
Ответ:
{
"institutesList": [
{
"instituteId": int,
"fullName": string,
"shortName": string,
"address": string,
"avgRating": float
}
]
}Возвращает рейтинг предметов в институте
Запрос:
GET /api/rating/institutes/{instituteId}
Параметры:
instituteId- id института
Ответ:
{
"result": {
"success": boolean,
"message": string
},
"coursesList": [
{
"courseId": string,
"courseDetails": {
"courseName": string,
"instituteName": string,
"instituteAddress": string,
"professorsNames": string
},
"avgRating": float
}
]
}Возвращает рейтинг пар предмета
Запрос:
GET /api/rating/course/{courseId}
Параметры:
courseId- id предмета
Ответ:
{
"result": {
"success": boolean,
"message": string
},
"classSessionsList": [
{
"sessionId": string,
"status": string,
"courseId": string,
"courseDetails": {
"courseName": string,
"instituteName": string,
"instituteAddress": string,
"professorsNames": string
},
"roomName": string,
"sessionName": string,
"professorName": string,
"startDateTime": string,
"endDateTime": string,
"disableAfterTimestamp": string,
"avgRating": float
}
]
}Возвращает список отзывов на пару. По сути, то же что и GET /api/sessions/reviews-list
Запрос:
GET /api/rating/session/{sessionId}
Параметры:
sessionId- id пары
Ответ:
{
"result": {
"success": boolean,
"message": string
},
"reviewsList": [
{
"reviewId": string,
"sessionId": string,
"studentFullName": string,
"value": int,
"comment": string,
"timestamp": string
}
]
}Для создания первого администратора нужно в браузере перейти по пути {host}/admin/create-first
Указать его реквизиты и нажать create.
После этого надо проверить что при логине {host}/login с указанными реквезитами вы успешно заходите и попадаете на страницу администратора {host}/admin-home.
Если нужно поменять пароль, пока что нужно делать в ручную через бд.
Для этого нужно дернутьGET {host}/encode?password={new_password}, полученную строку нужно вписать нужному пользователю в базу
Для доступа к панели администратора нужно перейти по пути {host}/admin-home или {host}/admin
(или нажать Домашнаяя страница на любой странице будучи админом).
Здесь есть следующие функции:
- Создание пользователя. Можно создавать как других админов, так и преподавателей.
- Создание института. Аббревиатура института уникальная и является вторичным ключем.
- Просмотр рейтинга. По нажатию открывается таблица рейтинга институтов, из которой можно добраться до любого рейтинга, вплоть до отзывов отдельной пары.
Для доступа к панели преподавателя нужно перейти по пути {host}/professor-home.
Здесь есть 2 блока:
- Список предметов с возможностью добавления новых и просмотра существующих. По нажатию на предмет открывается список запланированных пар предмета, с которого можно перейти на страницу пары или создать новую.
- Список запланированных пар с возможностью добавления новых и получения qr-кодов для отзыва.
Для того чтобы оставить отзыв нужно:
- Создать институт
- Создать предмет
- Создать пару с этим предметом
- На странице пары получить qr-код или перейти по ссылке под ним
- На открывшейся форме заполнить ФИО, поставить оценку и нажать кнопку Отправить
- Первоначально клонируем проект на сервер:
git clone <имя вашего репозитория>- Необходимо установить JAVA 17.
sudo apt update
sudo apt install openjdk-17-jdk
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
source ~/.bashrc3. Необходимо установить Chromedriver.
wget https://storage.googleapis.com/chrome-for-testing-public/126.0.6478.126/linux64/chrome-headless-shell-linux64.zip
unzip chrome-headless-shell-linux64.zip
sudo mv chrome-headless-shell-linux64 /usr/local/bin/chromedriver
sudo chown root:root /usr/local/bin/chromedriver
sudo chmod +x /usr/local/bin/chromedriver
export WEB_DRIVER_PATH=/usr/local/bin/chromedriver - Необходимо установить Firefox и Geckodriver.
Firefox:
sudo install -d -m 0755 /etc/apt/keyrings
wget -q https://packages.mozilla.org/apt/repo-signing-key.gpg -O- | sudo tee /etc/apt/keyrings/packages.mozilla.org.asc > /dev/null
echo "deb [signed-by=/etc/apt/keyrings/packages.mozilla.org.asc] https://packages.mozilla.org/apt mozilla main" | sudo tee -a /etc/apt/sources.list.d/mozilla.list > /dev/null
echo '
Package: *
Pin: origin packages.mozilla.org
Pin-Priority: 1000
' | sudo tee /etc/apt/preferences.d/mozilla
sudo apt update && sudo apt install firefoxGeckodriver:
wget https://github.com/mozilla/geckodriver/releases/download/v0.34.0/geckodriver-v0.34.0-linux64.tar.gz
tar -xvzf geckodriver-v0.34.0-linux64.tar.gz
chmod +x geckodriver- Установим PostgreSQL и создадим Базу данных, а также пользователя.
sudo apt update
sudo apt install postgresql
sudo service postgresql start
sudo systemctl enable postgresql
sudo su - postgres
psql -c "CREATE USER myuser WITH PASSWORD 'userPassword'"
psql -c "CREATE DATABASE mydatabase"
psql -c "GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser"
exit!Если не получается подключиться к базе данных откройте файл:
sudo nano /etc/postgresql/<версия БД>/main/postgresql.confи расскомментируйте строку:
#listen_addresses = 'localhost' Также можно добавить свой адрес:
listen_addresses = '192.168.1.100, 127.0.0.1'И перезапустим нашу базу данных:
sudo service postgresql restart- Установим maven для сборки проекта.
sudo apt update
sudo apt install maven
mvn --version-
Изменяем
src/main/resources/application.yml- ставим все нужные параметры, кроме urfu.username и urfu.password. -
Далее сформируем .jar файл. Для этого в директории проекта пропишите:
mvn package spring-boot:repackage
cd target- Запустим проект:
java -jar student-voice-0.2.jar --urfu.username=<пользователь> --urfu.password=<пароль>