Основные информационные экраны
Основные информационные экраны

Маленькая сельская школа, не особо продвинутая технологически. Поскольку школа маленькая, то и учителей в ней немного, и если кто-то не может вести занятия, расписание приходится каждый раз переделывать и вывешивать листочек на стенде — после чего вечером во всех школьных группах начинаются вопросы: а вы расписание сфотографировали? А пришлите!

Меня, конечно, проблема с расписанием не затрагивает вовсе, но как говорится, как-то неаккуратненько. Да и любопытство гложет, а смогу ли я...


Реализация системы сделана по принципу клиент-серверной технологии (не то, что без этого нельзя обойтись, но раз уж школа получила отдельный сервер по какой то гос. программе, почему бы не воспользоваться простаивающими мощностями). На сервере под 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.


Код и шаблоны системы лежат здесь. Для удобства перенес на гитхаб

Комментарии (50)


  1. FirstEgo
    18.12.2023 12:49

    Ну что за кликбейт?!(((

    Я уж надеялся на киберпанк с подключением школьников к общему серверу....


  1. kotleopold Автор
    18.12.2023 12:49

    Ну придется подождать Маска с его нейрочипами. Учителя будут за всеми тремя руками!


  1. Tirarex
    18.12.2023 12:49

    Идея отличная, реализация Может быть сильно улучшена.

    1. Дизайн мягко говоря устарел 15 лет назад. Тут не требуются какие то ВАУ технологии с кучей анимации. Буквально приятные мягкие шрифты, менее контрастные цвета, больше отступов вокруг данных ( для их разделения), аккуратное расположение данных с центрованием где оно нужно, Автоматические большие буквы в началах уроков, итд.

    2. Информативность хромает. Тут конечно от школы зависит но кажется было бы удобно иметь не только название урока но и данные о кабинете где он проходит.

    3. Код залить на гитхаб, для удобства контроля версий и возможных доработок от комьюнити

    4. Чуть прибавить отопление в школе, +19 это прохладно =)


    1. kotleopold Автор
      18.12.2023 12:49

      1. Первый опыт, учусь еще. к 3 пункту пока тоже.

      2. Школа маленькая, кабинеты указываются в редких случаях, при изменениях.

        1. Ну так Сибирь, у нас -40 было, школа отогреться не успела. Автоматика разгонит вскоре.


      1. dyadyaSerezha
        18.12.2023 12:49

        А зачем кол-во секунд до НГ?


        1. kotleopold Автор
          18.12.2023 12:49

          Для развития математических навыков у школяров!


          1. dyadyaSerezha
            18.12.2023 12:49

            Ох, сумлеваюсь я.... (с)

            Кстати, можно было бы сделать без веб-сервера и отдельной БД, одним приложением на питоне, например.


            1. kotleopold Автор
              18.12.2023 12:49

              Я тоже сомневаюсь, но новый год же... чудеса...

              На питоне все конечно, можно, но учитывая шесть мест, где у меня это расписание показывается, и то что каждый школьник может посмотреть расписание по сети внутри школы, как бы не самое эффективное. Плюс к этому, само расписание лишь часть системы управления школой, которая в настоящее время медленно строится.


              1. dyadyaSerezha
                18.12.2023 12:49

                Насчет каждого школьника, и даже их родителей, и даже учителей, и даже родителей и членов семьи учителей - с одним приложением на питоне проблем нет. А вот если дальше серьёзно развивать, то да...


      1. vcKomm
        18.12.2023 12:49

        По поводу дизайна: можно добавить какой-нибудь фреймворк, который не требует классов

        Например, sakura


        1. kotleopold Автор
          18.12.2023 12:49

          По поводу дизайна есть одно и неимоверно важное требование - быть нормальным и разумным дизайнером. Так вот я - не он ;)


          1. vcKomm
            18.12.2023 12:49

            Вот именно для таких целей и предназначена sakura. Без классов, без стилей. Чистый html + чужой css = прилично выглядящий html


            1. kotleopold Автор
              18.12.2023 12:49

              В моем случае, увы нет, только что попробовал. Чудеса даже под новый год не всегда случаются.


    1. init0
      18.12.2023 12:49

      Согласен, я бы предложил:

      • Температуры округлять до целого (никому эти доли не нужны)

      • Дату выводить в удобочитаемом формате, например 15 Янв. 2023 Пятница

      • Использовать шрифт без засечек (Sans Serif)


      1. kotleopold Автор
        18.12.2023 12:49

        Доли нужны мне, чтобы не заглядывать каждый раз в теплоузел. Дату изначально так и выводил, но попросили поменять. А со шрифтом попробуем, спасибо.


  1. kolabaister
    18.12.2023 12:49

    А откуда берется температура?


    1. kotleopold Автор
      18.12.2023 12:49

      Стоит самодельный термостат, он же автоматический звонок, управляющий школьным отоплением (электрокотлы). Температура внутренняя и наружняя используется для расчета мощности, ну и вывел на экран просто ради прикола. Собственно, вся система и началась с температурно-часового экрана.


  1. wineTGH
    18.12.2023 12:49

    Мне очень понравилась ваша статья. Очень жду проект на гитхабе, чтобы можно было помочь в разработке (а то мыльный диск не очень для этого подходит). Хочу устроится на работу в одну школу рядом с нашим городом, и мне бы этот проект очень бы помог :)


  1. Billander
    18.12.2023 12:49

    Подскажите почему не использовали готовые решения? Например ЭлЖур.


    1. kotleopold Автор
      18.12.2023 12:49

      Электронный журнал, как я понял, сменные расписания поддерживает неохотно, а для нас это необходимость. Не всегда есть до него доступ, и вход через госуслуги. Для малых сельских школ это многим добавило проблем.


  1. BerserkZak
    18.12.2023 12:49

    Выглядит очень интересно, тоже хочу что-нибудь автоматизировать на работе или в жизни, вот все думаю что именно, никак не могу собраться с мыслями и силами.

    Этот пост как пинок для меня, хд.


  1. randomsimplenumber
    18.12.2023 12:49

    peremen, Raspisanie, Urok.. 21 век, unicode поддерживается везде.. Думаю, если назвать скрипты и таблицы по человечески, ни один котенок не пострадает, англоязычные все равно не поймут, а русскоязычным будет легче.


    1. AgentFire
      18.12.2023 12:49

      Ловите 1С-ника!


  1. Kahelman
    18.12.2023 12:49

    Статья классная. Автор молодец. На предложения переписать на супер фреймворка и переделать здесь и там не обращайте внимание. Главное проект сделан и работает. Пользователи довольны. Сэкономленное на модных подходах время лучше потратить на автоматизацию чего нибудь ещё :).


  1. maximtkachev
    18.12.2023 12:49

    А "хронограф" не пробовали?

    В нем переставлять уроки легче, чем в экселе. И есть возможность отследить конфликты расписаний. Да и просто не получится воткнуть человеку урок, если у него другой урок в то же время в другом классе - выдаст предупреждение. Не знаю, правда, насчет вывода в ТГ. Все делал вручную.


    1. kotleopold Автор
      18.12.2023 12:49

      Спасибо за подсказку, посмотрим. Просто расписание состовляю не я, а люди то склонны к привычному, и уговорить пробовать новое всегда сложно.


      1. maximtkachev
        18.12.2023 12:49

        Ну это же не "Сферум" XD


        1. kotleopold Автор
          18.12.2023 12:49

          Не надо тут кошмаров! Бедные учителя, им же это все тестировать приходится.


          1. maximtkachev
            18.12.2023 12:49

            Период тестирования прошел в прошлом году. Теперь добровольно-принудительный период работы. Согласно распоряжению кого-то там, вся коммуникация теперь обязана идти через "Сферум", т.е. через VK мессенджер. Чувствую, Whatsapp скоро будет вне закона. А как "уйдут" Whatsapp, мэйл начнет рекламу в сферум добавлять, ибо поле для окучивания гигантское, и грех мэйлу будет его не задействовать.


  1. qenoamej
    18.12.2023 12:49

    То же на работе есть несколько страничек на php и mysql для внутреннего использования. Вроде не модно уже сейчас и не современно, зато максимально заточено под конкретные требования и легко дорабатывается под нужды, в отличие от громоздких готовых решений.

    Из предложений - вместо экселя сделать форму ввода расписаний прямо на сайте. Сначала хотел сделать загрузку как у вас (не расписание, другие данные), но форма ввода жёстко ограничена, можно сделать любые проверки данных, не надо никого учить правильно оформлять файл для загрузки.

    Из современного - сделал для личного использования десктопную программу на питоне, работающую с теми же базами данных. Но вот на написание кроссплатформенного приложения для винды и андроида знаний и времени уже не хватает, проще ту же веб-страницу немного доработать и открывать со смартфона.


    1. kotleopold Автор
      18.12.2023 12:49

      Самое страшное - это переучивать людей. Проще сделать привязку к тому, к чему все привыкли (форма бумажного расписания разработана давно и не меняется). Ну а насчет моды... она и так диктует слишком многое. Надо ли ее слушать - каждый имеет право решать только за себя.


      1. qenoamej
        18.12.2023 12:49

        В вашем случае согласен, это просто предложение из моего опыта. Там, где можно накосячить - накосячат, и в экселе вариантов много. А неправильно заполнить мою форму невозможно, проверку не пройдёт, и часть полей - список, там даже опечататься невозможно.


    1. ts347
      18.12.2023 12:49

      Только не надо делать как в нашем университете. Электронная ведомость - список студентов с выбором оценки каждого из выпадающего списка. Еще и у каждого стоит "5" по умолчанию. Юзабилити -100, зато не надо ничего валидировать и никого учить.

      Хотя бы импорт из текста, если уж не из экселя, должен быть.


      1. qenoamej
        18.12.2023 12:49

        У меня совсем другая небольшая форма, там нет сотен оценок, половина сотрудников со смартфона, на айфоне никто эксель загружать не будет. А с десктопов только отчёты смотрят, там и загружать нечего.

        Да и при разработке лично общался с тестовыми пользователями, хорошие предложения вносил, неудачные объяснял им, зато сейчас их в глаза не вижу уже года три.


  1. webalex127
    18.12.2023 12:49

    идея хорошая, реализация так себе

    1)

    CREATE TABLE `peremen` (
      `number` int(11) NOT NULL,
      `class` tinyint(4) NOT NULL,
      `lesson` tinyint(4) NOT NULL,
      `predmet` varchar(100) NOT NULL,
      `begin` date NOT NULL
    )

    Ну вы серъёзно? Почему бы не вынести predmet в отдельную таблицу как сущность? Тут рекомендую почитать https://habr.com/ru/articles/254773/

    2)

    Некоторый нейминг прям выколи глаз:

    • predmet

    • peremen

    • begin

    • raspisanie

    • nomer

    • urok

    • mnog

    3)

    printf("Невозможно подключиться к базе данных. Код ошибки: %s\n", mysqli_connect_error());
       echo "если вы еще не зашли в админку, перейдите по ссылке и создайте новые базы<a href='admin'>Администрирование</a>";

    А если БД лежит, то актуальный ли такой совет?

    4)

    setcookie('passt', $password, 0, '/');

    WTF??

    5)

    $loginp="portal"; // логин для доступа к базе
    $passp="wildgitar07"; //пароль для доступа к базе

    Дальше лень смотреть и писать, очень грустно


    1. kotleopold Автор
      18.12.2023 12:49

      Был бы человек идеален, зачем тогда нужны другие? А так то опыт и копится, через набивание шишек и очередные подъемы после падений. Гораздо хуже, когда идеей все и оканчивается, как у многих идеальных и происходит ;)


    1. vasyakrg
      18.12.2023 12:49

      4ый - мда, так точно не надо.

      Остальное - дело вкуса и дальнейшей поддержки.

      В любом случае, когда придут другие, скажут, что с нуля проще переписать. Как и в любом проекте ))


      1. kotleopold Автор
        18.12.2023 12:49

        Так я разве против, чем больше вариантов, тем лучше. Я же человек ленивый, был бы вариант использовать готовое, я бы им воспользовался.


  1. REPISOT
    18.12.2023 12:49

    Что такое "диагностика ЧГ"?

    Тут у 8-го и 9-го класса по 8 уроков в день. Это нормально? И у 7-го тоже есть 8 уроков в день. Или физ-ра, ОБЖ и всякие разговоры специально поставлены в конец, чтобы их прогуливать?


    1. kotleopold Автор
      18.12.2023 12:49

      Читательская грамотность. Что проверяют, не знаю, не учитель. А насчет восьми уроков - да, так расписание составлено. Учитывая, что восьмой - это классическая болталка, видимо можно.


    1. maximtkachev
      18.12.2023 12:49

      Нормальное расписание.


      1. REPISOT
        18.12.2023 12:49

        6 уроков было. 7 или 8 - никогда. Даже в 10-11 классе (суббота учебная была).


        1. maximtkachev
          18.12.2023 12:49

          Вот потому что суббота учебная была, у вас и было по 6 уроков.


  1. Kasheftin
    18.12.2023 12:49

    Сам много работал над расписаниями, хочу посоветовать подход из https://habr.com/ru/articles/412665/, https://codeburst.io/weekly-schedule-editor-concept-8df79ab83305. Впоследствии это преобразовалось в такую штуку, https://ttfiddle.rag.lt/new, правда по ней нет статей.


  1. piton_nsk
    18.12.2023 12:49

    Я может чего не понял, но зачем вся эта канитель с базой данных? Не проще ли сгенерить из xlsx файла html страничку и положить ее на сервере?


    1. kotleopold Автор
      18.12.2023 12:49

      У меня четыре места, где выводится информация по классам (разная). Я должен под каждое место генерить отдельную страничку, удалив предварительно лишнее? И учителям и школьникам рассылать файл по телеграмму вместо расписания на завтрашний день? Ну не знаю, мне кастомизируемость дешевле обеспечить небольшим усложнением начальной работы.


  1. Leo5878
    18.12.2023 12:49

    Год назад примерно, в колледже тоже писал проект по просьбе преподавателя для конкурса. Писал на nodejs. Так же парсел Эксель файлы и вносил данные в бд. Преподаватели и группы разнес в разные таблицы, а так же предметы. Все это собиралось в одну таблицу расписания.
    Для отображения расписания использовал grid.js. Для дней недели использовал табы из material (старая либа, не развивается, но у меня был пример с ее использованием я и использовал ее). Для выбора группы был сделан выпадающий список. Так же планировалось админка и страница для преподавателей, но из-за не надобности этого никому, оно свое развитие не продолжало. Так же была идея отправлять в телеграм расписание в случае изменения. Так же находил такую вот вещь, это конечно реализация не с нуля, но тоже неплохо)
    https://habr.com/ru/articles/733392


  1. magiavr
    18.12.2023 12:49

    Наименования в транскрипции, конечно, глаз режут. По безопасности тоже вопросы возникают. Делал тоже как-то расписание, но не школьное, и более сложное, учитывающее занятость помещений, преподавателей, позволяющее совместно учить группы, одновременно несколько преподавателей добавлять. Однако, подсвечивать коллизии надо было для админа. При этом расписание составлялось на каждую неделю динамически, ибо каждый раз было разное. Также считалась статистика по преподам и группам. Самое сложное было генерировать вывод в шаблон для печати визирования, так как он был по установленной форме, но приходилось его динамически генерировать из-за разной загруженности недель.


  1. SbWereWolf
    18.12.2023 12:49

    Автор, если есть желание, то помогу вам упаковать ваше приложение в докер, вашим коллегам из других школ будет легче жить - развертывание приложения упроститься до пары команд, контакты у меня в профиле.


    1. kotleopold Автор
      18.12.2023 12:49

      Спасибо, подумаю над этим вариантом.