Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Маленькая сельская школа, не особо продвинутая технологически. Поскольку школа маленькая, то и учителей в ней немного, и если кто-то не может вести занятия, расписание приходится каждый раз переделывать и вывешивать листочек на стенде — после чего вечером во всех школьных группах начинаются вопросы: а вы расписание сфотографировали? А пришлите!
Меня, конечно, проблема с расписанием не затрагивает вовсе, но как говорится, как-то неаккуратненько. Да и любопытство гложет, а смогу ли я...
Реализация системы сделана по принципу клиент-серверной технологии (не то, что без этого нельзя обойтись, но раз уж школа получила отдельный сервер по какой то гос. программе, почему бы не воспользоваться простаивающими мощностями). На сервере под Debian подняты Mysql, Apache и php, на клиентах обычные браузеры. Вся обработка сосредоточена на серверной стороне, клиенты получают уже обработанные данные и лишь их показывают.
Система электронного расписания в текущей реализации состоит из трёх подсистем — система ввода и разбора постоянного и временного расписания (расписание составляется человеком в виде таблицы в экселе), система обработки, выдающая подготовленные расписания для разных групп пользователей, и телеграмм-бота, осуществляющего рассылку расписания и графика работы учителей. Также в системе предусмотрен модуль информирования, показывающий различную информацию на клиентах, которому однако в текущее время ещё не найдено применение ;)
Ограничения системы — на текущий момент система умеет обрабатывать только первые 11 классов без букв, учащихся в одну смену, и не умеет показывать сменяющиеся экраны для большого количества классов (просто такой задачи не возникало).
Оптимизация — как таковой, в текущий момент нет. Делается достаточно много запросов внутри циклов, их можно уменьшить, но так как узким местом они не являются, не сделано.
Доработки — добавить модуль авторасписания, но здесь требуется уж слишком глубоко погружаться в комбинаторику, для чего не хватает опыта.
Устройство системы
Информация о модулях.
Первым по важности является модуль ввода данных, без него теряется смысл всей системы. Точнее их два, для постоянного и временного расписания. Всё их отличие только в модели сохранения данных в базе — постоянное расписание, как можно догадаться, привязано к дням недели, временное же — к конкретным числам. Всё что требуется от человека, осуществляющего ввод данных — загрузить подготовленный файл в нужный модуль.
Система принимает только файлы формата xslx (примеры файлов приложены в архиве), которые построчно разбираются и данные вносятся в базы постоянного (Permanent.php ) или временного (temp.php) расписания (структуры баз отличаются лишь одним пунктом — в постоянной указывается день недели, а во временной — конкретная дата. Сделано так для дальнейшего разбора, чтобы упростить работу)
Модуль обработки расписания (Shed.php). Имитирует бумажное расписание, но умеет интерактивно обновляться и подгружать расписание вперед по времени. Показывает информацию по методу волны (по мере прохождения недели, старое расписание подменяется новым.)
Поскольку в моём случае наличие хоть одной строки временного расписания на текущую дату означает, что весь день замещен, таким образом, для каждого дня проверяется наличие обновлении, если их нет, то выводится основное расписание, иначе — временное, выделяемое цветом, также цветом выделяется в расписании текущий день недели.
Модуль обработки вторичного расписания (uroks.php). Предназначен для вывода расписания на конкретный день, также высчитывает время до звонка и отличает звонки на перемену и урок; показывает конкретный урок в каждом классе, и после окончания уроков в каждом классе выводит расписание на следующий учебный день. Использует тот же принцип, что и модуль основного расписания, дополнительно использует базу звонков для вычисления уроков.
Модуль телеграмм-бота. Очень простой, умеет лишь выводить вечером или по запросу расписание на следующий день, а также по имени учителя показывает список его уроков. Состоит из трёх файлов (Gettel.php) — получающий сообщения от телеграмма и проверяющий получение команд, (Function.php) — содержащий обработчик запросов и работу с базой данный, и (Teleg.php) — отсылающий обработанное сообщение обратно и формирующий меню.
Структура базы данных.
Система для своей работы использует следующие таблицы базы данных (образы приложены в архиве):
peremen – таблица содержит данные временных расписаний. При пустой таблице система работает.
Raspisanie – В таблице содержится постоянный график учебы. При пустой таблице у нас будут сплошные выходные.
Urok — в таблице содержится расписание звонков. При пустой таблице работа вторичного модуля расписания нарушается.
Teacher — таблица содержит имена учителей, преподаваемые им предметы и классы. Нужна для работы telegram-бота, для вычисления занятости учителей. С пустой — система работает.
Calendar — таблица содержит различные события типа каникул, для выдачи информации о ближайших праздниках. С пустой — система работает.
Структура файлов:
в корне — папка HTML, содержащая:
index.html — файл, содержащий подгрузку расписания с помощью Аякс (Shed.php). Показывает текущее время. По умолчанию обновляет расписание раз в минуту, настраивается.
Shedule.html — подгружает вторичное расписание (Uroks.php), показывает текущее время, дату, время до следующего звонка. Обновляется раз в 30 секунд.
Shed.php — вывод внутреннего недельного расписания.
Uroks.php — вывод времени звонка и текущего расписания с обозначением уроков.
Bizz.php — выдача объявлений из таблицы calendar или подготовленных текстов и картинок под вторичным расписанием.
Папка Shedule — содержит в себе систему ввода расписания и файлы бота.
Index.php — подгружает в себя вторичные файлы системы (меню и прочее).
inc.php — файл заголовков, подгружает меню, запуск связи с базой данных.
Var.php — содержит переменные для работы (пароли к базе данных, ключи телеграмма).
bases.php — подключение к базе данных.
Temp.php — загрузка временного расписания.
permanent.php — загрузка постоянного расписания.
SimpleXLSX.php — обработчик xslx файлов.
Login.php — запрос пароля для допуска к системе.
Gettel.php — получение сообщений телеграмма, демон.
teleg.php — отправка сообщений в телеграмм.
function.php — обработка запросов телеграмм-бота.
папка bases — хранятся образы шаблонов базы и шаблоны расписания в виде файлов экселя, нужна только для настройки.
Запуск и наладка
Железо — испытано на стареньком Атоме с двумя гигабайтами памяти и ОС Дебиан, в принципе, с некоторыми доработками можно запустить и под машиной с виндовс, например под denver. Желательно иметь машину с двумя видеовыходами, и минимум один монитор разрешением минимум 17` (можно меньше, но придется очень сильно уменьшать размер шрифта, что будет неудобно).
Установка — считаем, что ОС, вебсервер с пхп и базами Mysql, а также PHPMYADMIN уже установлены и настроены (если нет, к вашим услугам яндекс и немножко внимания). Распаковываем архив в папку веб сервера (для debian и подобных — /var/www/html, для denver — смотрите путь установки), меняем права доступа для исполнителя веб сервера (обычно www-data (под дебиан изучаем команду Chown)), даем права на чтение, запись и выполнения для веб сервера (chmod). Открываем в браузере (локально) 127.0.0.1/phpmyadmin, логин по умолчанию root. Создаем базу uroki, заходим в нее Делаем импорт файла SQL из папки bases, должна создастся таблицы внутри. Переходим на основную страницу в учётные записи пользователей, создаем новый логин с паролем, задаем ему права на полный доступ к свежесозданной базе (если вы намерены редактировать базу по сети через PHPMYADMIN, не забудьте указать в списке хостов «все», но для нормальной работы это не очень нужно). Открываем файл Var.php в текстовом редакторе, прописываем в указанных строках логин и пароль от базы данных, а так же, если необходимо, токен и данные группы телеграмм-бота, куда будет отправляться информация
Можно открывать в браузере страницу по адресу 127.0.0.1 (или по адресу сервера в локальной сети, если просмотр будет не напрямую). Загрузится страница с шаблонным расписанием (если нет, читаем логи Апача и вдумчиво думаем). Если все нормально, открываем тот же адрес, не забыв добавить к нему \shedule. Должен появится запрос пароля, по умолчанию admin (правится в файле var.php). Правим шаблонные файлы расписаний, загружаем, проверяем на ошибки. Открываем на клиентах нужный вариант расписания -Ip/index.html или ip/shedule.html.
Код и шаблоны системы лежат здесь
https://cloud.mail.ru/public/ELNz/hLb1xW5LL