Публична платформа за графика на изпитите с администраторски панел, роли и пълен одит дневник.
Написана на чист PHP 8 + MySQL/MariaDB, без външни зависимости и без Composer —
качва се директно в public_html на споделен хостинг (SuperHosting.bg).
- Публична част — видима без вход, оптимизирана първо за телефон, с търсене и филтри.
- Панел за управление — две роли: Публикуващ (само изпити и учебни данни) и Администратор (всичко).
- Одит дневник — записва всяко влизане, редакция, публикуване и посещение; видим само за администратор.
- Език — целият интерфейс, съобщенията за грешки и документацията са на български.
| Функция | Описание |
|---|---|
| График на изпитите | Групиране по дата, ясно означени отменени изпити и „след N дни“ |
| Търсене | По дисциплина, преподавател, зала, код на дисциплината |
| Филтри | Курс (1–4 и магистри), специалност, група, форма на обучение (редовно/задочно), вид изпит, период |
| Страница на изпит | Пълна информация — дата, час, зала, корпус, изпитващ, форма на провеждане, бележки |
| Експорт | CSV файл и календар (.ics) за добавяне в телефона |
| Информация | Страница с често задавани въпроси и контакти |
| Мобилна оптимизация | Mobile-first CSS, сгъваем панел с филтри, четими карти на изпитите |
- Създаване, редакция, копиране и изтриване на изпити.
- Публикуване / връщане в чернова — черновите не се виждат публично.
- Означаване на изпит като отменен (остава видим, но с ясно обозначение).
- Управление на дисциплини, специалности и учебни групи.
- Смяна на собствената парола.
Всичко от горното, плюс:
- Потребители — създаване, роля, деактивиране, изтриване, генериране на нова временна парола.
- Одит дневник — филтри по действие, потребител и период; експорт в CSV.
- Посещения — брой посещения по дни и страници, разпознаване на ботове.
- Настройки — заглавие на сайта, съобщение към студентите, контактен имейл, срокове за съхранение на дневниците, ръчно изчистване на стари записи.
- Пароли с
password_hash()(bcrypt), задължителна смяна при първо влизане. - CSRF защита на всички формуляри (скрито поле
_token). - Защита от груба сила — записване и показване на неуспешните опити за вход.
- Всички заявки към базата през подготвени PDO заявки.
- Изходът е екраниран с
e()(HTML escaping) навсякъде. app/иsql/са блокирани от.htaccess;app/config.phpне се качва в Git.- В дневника за посещения не се пази IP адрес — само SHA-256 отпечатък със сол.
izpiti-tf-ruse/
├── index.php # Единствена входна точка (front controller) + таблица с маршрутите
├── router.php # Само за локална разработка с php -S
├── .htaccess # Пренасочване към index.php, кеш, защитни хедъри
├── assets/
│ ├── css/app.css # Дизайн система (mobile-first)
│ ├── js/app.js # Филтри, потвърждения при изтриване, зависими падащи менюта
│ └── img/favicon.svg
├── app/
│ ├── .htaccess # Забранен достъп по HTTP
│ ├── bootstrap.php # Начална настройка, сесия, автоматично зареждане
│ ├── config.sample.php # Образец за конфигурацията
│ ├── config.php # ВАШАТА конфигурация (не се качва в Git)
│ ├── lib/ # db, helpers, auth, audit, exams
│ ├── controllers/ # public, export, auth, admin_*
│ └── views/
│ ├── partials/ # Шаблони на публичната част и панела
│ ├── public/
│ └── admin/
└── sql/
├── 01_schema.sql # Структура на базата
└── 02_seed.sql # Специалности, групи, дисциплини и примерни изпити
- programs — специалности: код (ААТТ, ТТТ, ЕЕ, ДОРАТ…), степен (бакалавър/магистър), курс 1–4.
- study_groups — учебни групи към специалност и курс, с форма на обучение (редовно/задочно).
- subjects — дисциплини с код, курс, семестър и водещ преподавател.
- exams — изпити: дата, начален и краен час, зала, корпус, вид изпит, сесия, статус (чернова/публикуван), отменен, бележки.
- exam_groups — връзка изпит ↔ групи (изпит без избрани групи важи за целия курс).
- users — потребители с роля
admin/editor. - audit_log — всяко действие: кой, кога, какво, от кой IP, с детайли в JSON.
- visit_log — посещения на публичната част (анонимизирани).
- settings — настройки на платформата (ключ/стойност).
Подробните стъпки за SuperHosting.bg (cPanel + phpMyAdmin) са в DEPLOY.md.
Накратко:
- Създайте MySQL база и потребител в cPanel.
- Внесете
sql/01_schema.sql, след товаsql/02_seed.sqlпрез phpMyAdmin. - Качете съдържанието на хранилището в
public_html. - Копирайте
app/config.sample.phpкатоapp/config.phpи въведете данните за базата и новаip_salt. - Отворете сайта, влезте в
/admin/vhodи веднага сменете паролите на демо акаунтите.
| Потребител | Парола | Роля |
|---|---|---|
admin |
admin123 |
Администратор |
izpiti |
izpiti123 |
Публикуващ |
При първо влизане системата изисква смяна на паролата. Сменете ги, преди сайтът да стане публичен.
php -S 127.0.0.1:8080 -t . router.phpИзисквания: PHP 8.1 или по-нов с разширения pdo_mysql, mbstring, json.
- Без framework и без Composer — работи на всеки споделен хостинг с PHP 8.
- Един входен файл
index.phpс изрична таблица на маршрутите; всички URL адреси са на латиница, но със български имена (/izpiti,/admin/potrebiteli). - Шаблоните са обикновени PHP файлове, рендирани чрез
render($layout, $tpl, $data). - CSS без препроцесор, с променливи (
--brand-900…--brand-500) и mobile-first media queries. - Шрифт Inter с кирилски набор от Google Fonts.
MIT — свободно за използване и промяна от Русенски университет „Ангел Кънчев“ и всички други.
Списъкът на специалностите и магистърските програми е съставен по официалните страници на университета: специалности на Транспортен факултет, магистърски програми на ТФ, Транспортен факултет. Примерните изпити са демонстрационни и подлежат на замяна с реалния график.