Разработка базы данных учета пропусков учащихся и программы-клиента к ней

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    297,71 Кб
  • Опубликовано:
    2015-01-11
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка базы данных учета пропусков учащихся и программы-клиента к ней

ВВЕДЕНИЕ

программа база данные

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

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

Основная цель процесса проектирования базы данных состоит в получении такого проекта, который удовлетворяет следующим требованиям:

. Корректность схемы БД, база должна быть моделируемой, где каждому объекту программного обеспечения соответствуют данные в памяти ЭВМ, а каждому процессу - адекватные процедуры обработки данных.

. Обеспечение ограничений (на объёмы внешней и оперативной памяти и другие ресурсы вычислительной системы).

. Эффективность функционирования (соблюдение ограничений на время реакции системы на запрос и обновление данных).

. Защита данных (от сбоев и несанкционированного доступа).

. Простота и удобство эксплуатации.

. Гибкость, т.е. возможность развития и адаптации к изменениям программного обеспечения или требований пользователей.

Удовлетворение первых 4-х требований обязательно для принятия проекта.

В настоящее время создан ряд систем автоматизации проектирования БД, но ввиду специфики разработки баз данных не стали пока массовым инструментом разработчиков.

В данной работе описано создание базы данных по учету пропусков учащихся.

Актуальность: Почему данная программа необходима учебному заведению? Она значительно упрощает работу по ведению пропусков занятий учащимися. Если в отсутствии базы данных приходилось вести подсчет пропущенных занятий вручную, то с её появлением данная работа возлагается на персональный компьютер, пользователю лишь остаётся вносить контрольные данные. Работа с программой не требует особых навыков, необходимо лишь периодически вводить новые данные о пропущенных занятиях, а затем программа автоматически выдает количество уважительных и неуважительных пропусков, а также их сумму.

Объект: Разработка баз данных.

Предмет: Разработка базы данных и системы учета пропусков учащихся.

Цель: Разработать базу данных учета пропусков учащихся и программу-клиент к ней.

Задачи:

.        Проанализировать предметную область.

.        Спроектировать базу данных по учету пропусков.

.        Разработать программу-клиент для взаимодействия с базой данных.

1. ЭТАПЫ ПРОЕКТИРОВАНИЯ БАЗЫ ДАННЫХ

программа база данные

1.1 Общие сведения об этапах проектирования


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

·              используемых методов анализа предметной области;

·              правил именования и обозначения объектов программного обеспечения, атрибутов и связей;

·              содержания и формата создаваемых ими документов.

Процесс проектирования включает в себя следующие этапы:

. Анализ предметной области

. Информационно-логическое (концептуальное) проектирование.

. Логическое проектирование БД.

. Физическое проектирование БД.

Концептуальное и логическое проектирование базы данных включает три основных этапа. Задачей первого этапа является разбиение проекта на группу относительно небольших и более простых задач исходя из представлений о предметной области приложения, свойственных каждому из типов конечных пользователей. Результатом выполнения этого этапа является создание локальных концептуальных моделей данных, представляющих собой полное и точное отражение представлений о предметной области приложения отдельных типов пользователей.

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

На третьем этапе выполняется объединение локальных логических моделей данных (отражающих представление о предметной области отдельных типов пользователей) в единую глобальную логическую модель данных всего предприятия (обобщающую представления о предметной области всех типов пользователей). Глобальная логическая модель проверяется по такому же принципу, как и локальные модели; это позволяет убедиться в том, что ее структура является правильной и поддерживает все необходимые транзакции. Этот этап обычно требуется, если приложение состоит более чем из одного представления.

[Коннолли Т., Бегг К. Базы данных. Проектирование, реализация и сопровождение. Теория и практика. - 3-е изд. - М.: Вильямс <#"783861.files/image001.gif">

Итого по группе


Таблица 2.1 пропуски группы за период

Сущность

Атрибуты

Тип данных

Студенты

Идентификатор Фамилия Имя  Группа

Числовой (10) Текстовый (32) Текстовый (20) Текстовый (5)

Уважительные

Идентификатор студента Месяц День Значение

Числовой (10)  Числовой (12) Числовой (31) Числовой (4)

Неуважительные

Идентификатор студента Месяц День Значение

Числовой (10)  Числовой (12) Числовой (31) Числовой (4)

 

Таблица 2.2 Сущности

Главный

Атрибут

Ведомый

Тип

Студент

Идентификатор Идентификатор

Идентификатор Идентификатор

Уважительные Неуважительные

1:М 1:М


Таблица 2.3 Связи сущностей

Рисунок 1.1 ER-диаграмма базы данных учёта пропусков

1.3 Логическое проектирование БД


На этапе логического проектирования разрабатывается логическая структура БД, соответствующая инфологической модели предметной области. Решение этой задачи существенно зависит от модели данных, поддерживаемой выбранной системе управления. Результатом выполнения этого этапа являются схемы баз данных концептуального и внешнего уровней архитектуры, составленные на языках определения данных (DDL) выбранной СУБД.

[Дейт К.Дж. Введение в системы баз данных <#"783861.files/image004.gif">

Рисунок 1.2 DDL диаграмма базы данных учёта пропусков студентов

.4 Физическое проектирование БД

Этап физического проектирования заключается в увязке логической структуры базы данных и физической среды хранения с целью наиболее эффективного размещения данных, т.е. отображении логической структуры БД в структуру хранения. Решается вопрос размещения хранимых данных в пространстве памяти, выбора эффективных методов доступа к различным компонентам «физической» базы данных. Результаты этого этапа документируются в форме схемы хранения на языке определения хранимых данных. Принятые на этом этапе решения оказывают определяющее влияние на производительность системы.

Фактически проектирование БД имеет итерационный характер. В процессе функционирования системы становится возможным измерение её реальных характеристик, выявление «узких» мест. И если система не отвечает предъявляемым к ней требованиям, то обычно она подвергается реорганизации, т.е. модификации первоначально созданного проекта.

Методология физического проектирования базы данных

Создание локальной физической модели данных предприятия на основе представления о предметной области каждого отдельного типа пользователей.

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

[Хаббард, Дж. Автоматизированное проектирование баз данных; М.: Мир, 2011. - 453 c.]

DATABASE `absences`;TABLE IF NOT EXISTS `invalids` (

`s_id` int(10) unsigned NOT NULL,

`month` tinyint(3) unsigned NOT NULL,

`day` tinyint(3) unsigned NOT NULL,

`value` tinyint(3) unsigned NOT NULL,KEY (`s_id`,`month`,`day`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Листинг 1.1 Запрос на создание таблицы invalids (неуважительные)TABLE IF NOT EXISTS `students` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`first_name` varchar(30) COLLATE utf8_unicode_ci NOT NULL,

`last_name` varchar(32) COLLATE utf8_unicode_ci NOT NULL,

`group` varchar(5) COLLATE utf8_unicode_ci NOT NULL,KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8;

Листинг 1.2 Запрос на создание таблицы students (студенты)TABLE IF NOT EXISTS `valids` (

`s_id` int(10) unsigned NOT NULL,

`month` tinyint(3) unsigned NOT NULL,

`day` tinyint(3) unsigned NOT NULL,

`value` tinyint(3) unsigned NOT NULL,KEY (`s_id`,`month`,`day`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Листинг 1.3 Запрос на создание таблицы valids (уважительные)TABLE `invalids`CONSTRAINT `invalids_s_id_foreign` FOREIGN KEY (`s_id`) REFERENCES `students` (`id`);

Листинг 1.4 Запрос на создание внешнего ключа для таблицы invalids (неуважительные)TABLE `valids`CONSTRAINT `valids_s_id_foreign` FOREIGN KEY (`s_id`) REFERENCES `students` (`id`) ON DELETE CASCADE;

Листинг 1.5 Запрос на создание внешнего ключа для таблицы valids (уважительные)students.group, _tab_month.v_month, _tab_month.i_month, _tab_per.v_per, _tab_per.i_per, (`students`.`id`) AS `members`studentsJOIN

(SELECT `students`.`group`, SUM(`valids`.`value`) AS `v_month`students LEFT JOIN valids WHERE month = ? BY students.group) AS v_tab_monthv_tab_month.group = students.groupJOIN

(SELECT `students`.`group`, SUM(`invalids`.`value`) AS `i_month`students LEFT JOIN invalids WHERE month = ? BY students.group) AS i_tab_monthi_tab_month.group = students.groupJOIN

(SELECT `students`.`group`, SUM(`valids`.`value`) AS `v_per`students LEFT JOIN valids WHERE month >= ? AND month <= ?BY students.group) AS v_tab_perv_tab_per.group = students.groupJOIN

(SELECT `students`.`group`, SUM(`invalids`.`value`) AS `i_per`students LEFT JOIN invalids WHERE month >= ? AND month <= ?BY students.group) AS i_tab_peri_tab_per.group = students.groupBY students.group

Листинг 1.6 Запрос на выборку результатов по группамINTO valids VALUES(?,?,?,?);INTO invalids VALUES(?,?,?,?);

Листинг 1.7 Запрос на вставку или обновление пропусков.FROM valids WHERE s_id = ? AND month = ? AND day = ?;FROM valids WHERE s_id = ? AND month = ? AND day = ?;

Листинг 1.8 Запрос на удаление пропусковFROM students WHERE id = ?;

Листинг 1.9 Запрос на удаление студентаstudents SET first_name = ?, last_name = ?, group = ? WHERE id = ?;

Листинг 1.10 Запрос на изменение данных о студентеINTO students VALUES (NULL, ?, ?, ?);

Листинг 1.11 Запрос на добавление нового студента

В процессе проектирования базы данных была проанализирована предметная область, на этапе концептуального проектирования была построена ER-диаграмма базы данных учёта пропусков, а на этапе логического проектирования - DDL диаграмма базы данных учёта пропусков студентов. В процессе выполнения данных операций были разработаны три таблицы. Одна для хранения данных по учащимся, две другие - для хранения пропусков. В результате физического проектирования базы данных были построены запросы для работы с таблицами уважительных и неуважительных пропусков.

2. РАЗРАБОТКА СИСТЕМЫ УЧЁТА ПРОПУСКОВ УЧАЩИХСЯ


.1 Инструментальные средства разработки

Данная система является веб-приложением, для её работы необходим веб-сервер и веб-браузер в качестве клиента.

Ядром системы выступает фреймворк Laravel 4 который будет обеспечивать взаимодействие с базой данных, выполнять маршрутизацию запросов и вывод результата в браузер.

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

Для написания листингов использовалась IDE NetBeans 8.

Минимальные системные требования.

Процессор Pentium 333

ОЗУ 32 МБ

HDD 200 МБ

Apache 2.4.4

MySQL 5.6.12

PHP 5.3.4

Установка

Запустить установщик WAMP server, следовать инструкциям. После установки скопировать продукт в папку www/propuski WAMP сервера.

Выполнить команду

php composer.phar update

Произойдёт загрузка дополнительных компонентов продукта.

В системном трее, щелкнуть левой кнопкой мыши по значку WAMP сервера. Выбрать Apache > Alias directories > Add an alias. В появившемся окне ввести название псевдонима, например: propuski. И путь к папке с продуктом, например: c:/wamp/www/propuski/public. После данных манипуляций продукт будет доступен из окна браузера по адресу <#"783861.files/image005.gif">

Рисунок 2.1 Главная страница

На каждой странице отображается панель инструментов, которая содержит следующие пункты:

Пропуски - позволяет вернуться на главный экран.

Рисунок 2.2 Пропуски

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

Рисунок 2.3 Редактор групп

Период за который нужно рассчитать пропуски. Данный пункт состоит из двух колонок, начало периода и конец периода, нажав на которые, выводится список месяцев.

Рисунок 2.4 Период

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

Рисунок 2.5 Быстрая вставка

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

Рисунок 2.6 Список групп

Основную часть занимает отчет по пропускам каждого студента. Которые представляют из себя панель, состоящую из заголовка (с фамилией именем учащегося) и таблицей пропусков.

Рисунок 2.7 Отчет по пропускам каждого студента

[Минаси М. Графический интерфейс пользователя: секреты проектирования. - М.: Мир, 2010. - 453 с.]

[Мандел Т. Дизайн интерфейсов. - М.: ДМК Пресс, 2010. - 210 с.]

.3 Разработка программной части сервера и клиента

 

Предварительная настройка Laravel

Для подключения к базе данных необходимо указать адрес нахождения сервера и тип системы управления базами данных. Данные по настройке подключения находятся app\config\database.php.

Указываем тип базы данных в параметре default=> mysql

Подключение настраивается в параметре connections и разделе mysql

‘host’=>’localhost’ // база данных находится на том же компьютере, что и программа.

‘database’ => ‘absences’

Для формирования пустых таблиц настроим миграции, для этого введём команды в командной строке

Php artisan migrations:create_table_studentsartisan migrations:create_table_validsartisan migrations:create_table_invalids

После чего в папке database\migrations появятся три файла, каждый для своей таблицы.

Листинг 2.1 Скрипт создания таблицы учеников

public function up()

{

Schema::create('students', function($table)

{

$table->increments('id');

$table->string('first_name', 30);

$table->string('last_name', 32);

$table->string('group', 5);

});

}

Листинг 2.2 Скрипт создания таблицы уважительных пропусковfunction up()

{

Schema::create('valids', function($table)

{

$table->integer('s_id')->unsigned();

$table->foreign('s_id')->references('id')->on('students')->onDelete('cascade');

$table->tinyInteger('month')->unsigned();

$table->tinyInteger('day')->unsigned();

$table->tinyInteger('value')->unsigned();

$table->primary(array('s_id', 'month', 'day'));

});

}

Листинг 2.3 Скрипт создания таблицы неуважительных пропусков

public function up()

{::create('valids', function($table)

{

$table->integer('s_id')->unsigned();

$table->foreign('s_id')->references('id')->on('students')->onDelete('cascade');

$table->tinyInteger('month')->unsigned();

$table->tinyInteger('day')->unsigned();

$table->tinyInteger('value')->unsigned();

$table->primary(array('s_id', 'month', 'day'));

});

}

После написания скриптов необходимо выполнить команду

Php artisan migrate

В результате в базе данных будут созданы три таблицы.

Маршрутизация.

Маршрутизация отвечает за отправку запросов на сервер и выдачу данных на этот запрос.

За выдачу маршрутов отвечает файл routes.php, находящийся в папке app (приложение 1).

Файл маршрутизации сравнивает запросы указанные программой клиентом со своими. В случае совпадения запускает метод связанного этим запросом контролёра.

В данной программе были определены следующие маршруты:

Get- запросы на выдачу данных:

·        /{period?} - запрос на выдачу данных о всех группах. Параметр period имеет формат [0-9]{2}-[0-9]{2} и отправляет на сервер период, за который нужно получить данные. «?» - означает, что данный параметр может указываться или нет.

·        /group/{no}/{period} - запрос на выдачу данных по конкретной группе. Номер группы передается в параметре no. Параметр период, как в предыдущем запросе.

Post - запросы на вставку данных:

·        /api/addpass - запрос на вставку пропусков. Данные по пропускам передаются в закрытом виде.

·        /group/{no}/{period} - запрос на вставку ученика в указанную группу.

·        /api/addstud - запрос на асинхронную вставку ученика.

Put - запросы на изменение данных:

·        /api/{sid} - запрос на изменение данных об ученике.

·        /api/group/migrate - запрос на перевод учеников на один год.

Delete - запросы на удаление:

·        /api/{sid} - запрос на удаление указанного пользователя.

Контролёр

Контролёр используется для связи данных с представлениями. В данном продукте два контролёра: BaseController.php (приложение 2), GroupController.php (приложение 3), которые находятся в папке app/controllers.

BaseController - базовый контролёр, содержит общие методы для других контролёров.

__construct - метод запускается автоматически при инициализации класса, предварительно устанавливает период и формирует список групп.

getGroupListOnly - выдает сформированный список групп.

periodEncode - переделывает период под формат для хранения в базе данных.

periodDecode - переделывает период из формата бд в обычный формат.

setPeriod - устанавливает новый период.

setViewPeriod - передает данные о дате и периоде в представление.

switchYear - устанавливает год относительно текущего.

getDays - формирует календарь для текущего месяца.

GroupController - основной контролёр, отвечает за выдачу данных для всех маршрутов.

Index - отображает главный экран.

getAbsencesList - подсчитывает сумму пропусков по каждой из групп.

One - выводит список группы и пропусков по каждому ученику.

getStudentsInGroup - выводит список студентов.

getValids - выводит список уважительных пропусков для указанного ученика.

getInvalids - выводит список неуважительных пропусков для указанного ученика.

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

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

getPeriodSum - подсчитывает сумму пропусков за период для указанного ученика.

addPass - добавляет пропуски за один день.

studentFastAdd - быстрая вставка нового ученика.

replasePass - заменяет пропуски указанного студента за день.

Модель - представлениеобъекта базы данных в виде класса.

Используется четыре модели: group.php, invalids.php, students.php, valids.php, которые находятся в папке app/models.

Group - модель оперирует данными из таблицы students и является расширением стандартной модели Eloquent, которая стилизует запросы к базе данных.

scopePrepareListOnly - сформирует запрос на выборку уникальных значений из таблицы students по полю group.

scopeGetAll - формирует запрос к базе данных на подсчет пропусков за указанный период по группам.

createView - используется для формирования представлений к предыдущему методу.

Invalids, valids - классы также являются расширением модели Eloquent и отвечают за обмен данными в таблицах invalids и valids, не содержат в себе никаких расширяющих методов.

Students - работает также, как предыдущие модели, но отвечает за таблицу students.

Представления.

Представления используются для визуализации данных в удобном формате для пользователя. За визуализацию отвечают три файла:

master.blade.php - является шаблоном, задает общие элементы для всех представлений (приложение 4).

group,blade.php - выводит таблицы пропусков для одной группы (приложение 5).

groups.blade.php - выводит суммы пропусков по группам (приложение 6).

Все представления написаны на языке HTML с вставками PHP кода.

За стилистическую составляющую отвечает шаблонизатор Bootstrap 3.1.1

.4 Руководство пользователя

При первом запуске программы необходимо создать группу. Любая группа существует, пока в ней есть учащиеся. Список учеников формируется с помощью редактора групп.

Рисунок 2.8 Редактор групп

В поле Группа находится её название, а в поле Добавить ученика фамилия и имя ученика, который добавляется в данную группу. Добавляя следующего учащегося вводить название группы не надо.

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

После того, как создана группа, информация о ней появится на главном экране.

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

Рисунок 2.9 Редактирование пропусков

Все пропуски вносятся в соответствующие поля таблиц. Данные сохраняются автоматически.

Для печати отчетов достаточно на нужном экране вызвать мастер печати браузера нажатием клавиши Ctrl+P, либо выбрать Сервис - Печать на панели инструментов браузера.

Рисунок 2.10 Печать отчётов

ЗАКЛЮЧЕНИЕ

В процессе работы над выпускной квалификационной работой была создана база данных «учета пропусков учащихся». В результате проведена следующая работа:

Проведен анализ предметной области и сформулированы требования к базе данных;

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

На основе инфологической модели спроектирована физическая модель базы данных, результатом которой является схема данных;

Рассмотрена СУБД, в которой выполнялось создание базы данных;

Спроектированы таблицы в режиме SQL;

Спроектированы запросы в режиме SQL.

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

Значительно упрощает работу по ведению пропусков учеников;

Полностью замещает кропотливую работу с бумажной документацией;

Выдает полный отчет по пропускам за определенный период времени;

СПИСОК ЛИТЕРАТУРЫ

 

1. Аткинсон, Леон MySQL. Библиотека профессионала; М.: Вильямс, 2013. - 624 c.

. Грабер, Мартин SQL. Справочное руководство; М.: Лори; Издание 2-е, 2011. - 354 c.

3. David Cochran Twitter Bootstrap Web Development How-To <http://books.google.ru/books?id=7LjFN1wXH8QC>. - Packt <http://en.wikipedia.org/wiki/Packt>, 2012. - 68 с.

4. Грабер, Мартин Понимание SQL; М.: Лори, 2012. - 125 с.

. Дейт К. Дж. Введение в системы баз данных <http://ru.wikipedia.org/wiki/%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D0%B1%D0%B0%D0%B7_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85>. - 8-е изд. - М.: «Вильямс» <http://ru.wikipedia.org/w/index.php?title=%D0%92%D0%B8%D0%BB%D1%8C%D1%8F%D0%BC%D1%81_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>, 2011. - 1328 с.

. Дюбуа, Поль MySQL; М.: Вильямс; Издание 2-е - Москва, 2010. - 185 c.

. Каба М. MySQL; СПб.: Питер, 2011. - 113 с.

. Коннолли Т., Бегг К. Базы данных. Проектирование, реализация и сопровождение. Теория и практика. - 3-е изд. - М.: Вильямс <http://ru.wikipedia.org/w/index.php?title=%D0%92%D0%B8%D0%BB%D1%8C%D1%8F%D0%BC%D1%81_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>, 2012. - 1436 с.

. Кузнецов Максим , Симдянов Игорь MySQL 5; БХВ-Петербург - Москва, 2010. - 502 c.

. Кузнецов С. Д. Основы баз данных. - 2-е изд. - М.: Интернет-Университет Информационных Технологий; БИНОМ. Лаборатория знаний, 2011. - 484 с.

. Мандел Т. Дизайн интерфейсов. - М.: ДМК Пресс, 2010. - 210 с.

. Минаси М. Графический интерфейс пользователя: секреты проектирования. - М.: Мир, 2010. - 453 с.

. Паутов А. Документация по MySQL. - М.: ДМК Пресс, 2012. - 157 с.

14. Shawn McCool Laravel Starter. - Packt Publishing <http://en.wikipedia.org/wiki/Packt_Publishing>, 2012. - 64 с.

. Taylor Otwell Laravel: From Apprentice To Artisan; Leanpub, 2013. - 67 с.

16. Туманов, В.Е. Основы проектирования реляционных баз данных; Бином, 2012. - 420 c.

. Хаббард, Дж. Автоматизированное проектирование баз данных; М.: Мир, 2011. - 453 c.

. Хомоненко А.Д. Базы данных: учеб. для вузов / В.М. Циганков, М.Г. Мальцев. СПб.: Корона Принт, 2011 г. - 736 с.

. Энсор, Д.; Стивенсон, Й. Проектирования баз данных; Киев: BHV, 2010. - 560 c.

. Яргер, Р.Дж.; Риз, Дж.; Кинг, Т. MySQL: Базы данных для небольших предприятий и Интернета; СПб: Символ-Плюс, 2013. - 560 c.

. Свободная общедоступная многоязычная универсальная энциклопедия: сайт организации «Фонд Викимедиа». [Электронный ресурс]. 2001. Дата обновления: 05.03.2013 URL: http://ru.wikipedia.org (дата обращения 05.03.2013).

. Технологии баз данных: SQL, T-SQL, PL/SQL, реляционные БД: сайт компании Ionet Inc. [Электронный ресурс]. 2011. Дата обновления: 28.02.2013. URL: www.datasql.ru <http://www.datasql.ru/> (дата обращения 28.02.2013).

23. THE PHP FRAMEWORK FOR WEB ARTISANS. [Электронный ресурс]. 2010. Дата обновления: 20.02.2013. URL: http://laravel.com (дата обращения 20.02.2013).

24. PHP: Hypertext Preprocessor. [Электронный ресурс]. 2009. Дата обновления: 18.03.2013. URL: <http://php.net> (дата обращения 18.03.2013).

25. The most popular front-end framework for developing responsive, mobile first projects on the web. [Электронный ресурс]. 2007. Дата обновления: 13.06.2013. URL: http://getbootstrap.com (дата обращения 13.06.2013).

ПРИЛОЖЕНИЯ

Приложение 1

Файл маршрутизации::setContentTags('<%', '%>');::setEscapedContentTags('<%%', '%%>');::get('/{period?}', 'GroupController@index')->('period', '[0-9]{2}-[0-9]{2}');::get('/raw/{period?}',

'GroupController@rawIndex')->where('period', '[0-9]{2}-[0-9]{2}');::get('/raw/grouplist', 'GroupController@rawGroupsList');::get('/group/{no}/{period?}',

'GroupController@one')->where('period', '[0-9]{2}-[0-9]{2}');::get('/api/studentlist/{no?}', 'GroupController@studentList');::post('/api/addpass', 'GroupController@addPass');::post('/group/{no}/{period?}',

'GroupController@studentFastAdd')->('period', '[0-9]{2}-[0-9]{2}');::post('/api/addstud', 'GroupController@addStud');

// Put::put('/api/{sid}', 'GroupController@editStud');

// /api/group/migrate

// Delete::delete('/api/students', 'GroupController@remStud');

// /api/{sid}

Приложение 2

Основной контролёрBaseController extends Controller {$groupListOnly;$period;$monthNames = array('',

'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль',

'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь');function __construct()

{

$this->groupListOnly = Group::prepareListOnly()->()->toArray();

$this->period = array(9, date('n'));

}function getGroupListOnly()

{$this->groupListOnly;

}function periodEncode($period)

{

$monthStruct = array('',5,6,7,8,9,10,11,12,1,2,3,4);array($monthStruct[$period[0]],

$monthStruct[$period[1]]);

}function periodDecode($period)

{

$monthStruct = array('',9,10,11,12,1,2,3,4,5,6,7,8);array($monthStruct[$period[0]],

$monthStruct[$period[1]]);

}function setPeriod($period)

{

$period = explode('-', $period);

$this->period = array((int)$period[0], (int)$period[1]);

}function setViewPeriod()

{::share('startMonthName',

$this->monthNames[$this->period[0]]);::share('endMonthName',

$this->monthNames[$this->period[1]]);::share('monthNames', $this->monthNames);::share('monthStart', $this->period[0]);::share('monthEnd', $this->period[1]);::share('groupList', ::prepareListOnly()->get()->toArray());

}function switchYear()

{

$currentYear = date('Y');($this->period[1] >= 9 &&

$this->period[1] <= 12 and ('n') >= 1 && date('n') <= 8) {

$currentYear--;

}($this->period[1] >=1 &&

$this->period[1] <= 12 and ('n') >= 9 && date('n') <= 12) {

$currentYear++;

}$currentYear;

}function getDays()

{

$dinmonth = cal_days_in_month(CAL_GREGORIAN,

$this->period[1], $this->switchYear());

$dow = array('вс','пн','вт','ср','чт','пт','сб');($day = 1; $day <= $dinmonth; $day++) {

$ts = strtotime($this->switchYear() . '-' .

$this->period[1] . '-' . $day);(!date('w', $ts)) {;

$days[$day] = $dow[date('w', $ts)];

}$days;

}function setupLayout()

{( ! is_null($this->layout))

{

$this->layout = View::make($this->layout);

}

}

}

Приложение 3

Дополнительный контролёрGroupController extends \BaseController {$layout = 'layouts.master';function index($period = false)

{::share('title', 'Пропуски');::share('baseLink', '');

$out = array(

'absences' => $this->getAbsencesList($period)

);

$this->setViewPeriod();

$this->layout->content = View::make('groups', $out);

}function rawIndex($period = false)

{Response::json($this->getAbsencesList($period));

}function getAbsencesList($period = false)

{($period) {

$this->setPeriod($period);

}::share('currentMonth', $this->monthNames[$this->period[1]]);Group::getAll($this->periodEncode($this->period))->get()->toArray();

}function one($no, $period = false)

{::share('title', 'Пропуски');::share('baseLink', 'group/'.$no.'/');($period) {

$this->setPeriod($period);

}

$this->setViewPeriod();

$out = array(

'groupList' => Group::prepareListOnly()->get()->toArray(),

'current' => $no,

'basicData' =>Group::getAll($this->periodEncode($this->period))->where('students.group', '=', $no)

>get()->toArray(),

'studentsList' => $this->getStudentsInGroup($no),

'monthDays' => $this->getDays(),

);

$this->layout->content = View::make('group', $out);

}function getStudentsInGroup($no)

{

$studentsInGroup = Students::select(array('id', DB::raw('CONCAT(last_name , " " , first_name) AS name')))

>where('group', '=', $no)->get()->toArray();($studentsInGroup as $student) {

$out[$student['id']] = array(

'name' => $student['name'],

'valids' => $this->getValids($student['id']),

'invalids' => $this->getInvalids($student['id']),

'total' => $this->getPeriodSum($student['id']),

);

}$out;

}function getValids($studId)

{

$valids = Valids::select(array('day', 'value'))

>where('month', '=', $this->periodEncode($this->period)[1])

>where('s_id', '=', $studId)->get()->toArray();

$out['total'] = $this->getValidsSum($studId);(empty($valids)) {$out;

}($valids as $pass) {

$out[$pass['day']] = $pass['value'];

}$out;

}function getInvalids($studId)

{

$invalids = Invalids::select(array('day', 'value'))

>where('month', '=', $this->periodEncode($this->period)[1])

>where('s_id', '=', $studId)->get()->toArray();

$out['total'] = $this->getInvalidsSum($studId);(empty($invalids)) {$out;

}($invalids as $pass) {

$out[$pass['day']] = $pass['value'];

}$out;

}function getValidsSum($studId)

{

$valids = Valids::select(DB::raw('SUM(value) AS total'))

>where('month', '=', $this->periodEncode($this->period)[1])

>where('s_id', '=', $studId)->get()->toArray();(empty($valids)) {array();

}(int)$valids[0]['total'];

}function getInvalidsSum($studId)

{

$invalids = Invalids::select(DB::raw('SUM(value) AS total'))

>where('month', '=', $this->periodEncode($this->period)[1])

>where('s_id', '=', $studId)->get()->toArray();(empty($invalids)) {array();

}(int)$invalids[0]['total'];

}function getPeriodSum($sid)

{

$vsumm = Valids::select(DB::raw('SUM(value) AS total'))

>where('month', '>=', $this->periodEncode($this->period)[0])

>where('month', '<=', $this->periodEncode($this->period)[1])

>where('s_id', '=', $sid)->get()->toArray();

$isumm = Invalids::select(DB::raw('SUM(value) AS total'))

>where('month', '>=', $this->periodEncode($this->period)[0])

>where('month', '<=', $this->periodEncode($this->period)[1])

>where('s_id', '=', $sid)->get()->toArray();$vsumm[0]['total'] + $isumm[0]['total'];

}function rawGroupsList()

{Response::json(Group::prepareListOnly()->get()->toArray());

}function addPass()

{

$data = Input::all();

$this->setPeriod($data['period']);

$this->replacePass($data['type'], $data['studentId'], $this->periodEncode($this->period)[1],

$data['day'], $data['value']);Response::json(array(

'byGroup' => Group::getAll($this->periodEncode($this->period))

>where('students.group', '=', $data['group'])

>get()->toArray()[0],

'byStudent' => array(

'id' => $data['studentId'],

'valids' => $this->getValidsSum($data['studentId']),

'invalids' => $this->getInvalidsSum($data['studentId']),

'period' => $this->getPeriodSum($data['studentId'])

)

));

}function studentFastAdd($no, $period = false)

{

$data = Input::all();

$studentName = explode(' ', trim($data['student-fast-add-name']));

$studnet = new Students;

$studnet->first_name = $studentName[1];

$studnet->last_name = $studentName[0];

$studnet->group = $no;

$studnet->save();Redirect::to('/group/'.$no.'/'.$period);

}function addStud()

{

$data = Input::all();

$studentName = explode(' ', trim($data['student']));

$student = new Students;

$student->first_name = $studentName[1];

$student->last_name = $studentName[0];

$student->group = $data['group'];

$student->save();$this->studentList($data['group']);

}function remStud()

{

$data = Input::all();::destroy($data['ids']);$this->studentList($data['group']);

}function editStud($sid)

{

$data = Input::all();

$studentName = explode(' ', trim($data['newName']));

$student = Students::where('id', '=', $sid);

$student->first_name = $studentName[1];

$student->last_name = $studentName[0];

$student->save();Response::json(array('success' => true));

}function replacePass($type, $sid, $month, $day, $val)

{

$pass = Valids::where('s_id', $sid)->where('month', $month)->where('day', $day);($type == 'i') {

$pass = Invalids::where('s_id', $sid)->where('month', $month)->where('day', $day);

}(!(bool)$val) {

$pass->delete();

} elseif (!$pass->count()) {

$pass->insert(array('s_id' => $sid, 'month' => $month, 'day' => $day, 'value' => $val));

} else {

$pass->update(array('value' => $val));

}

}function studentList($no = '')

{

$groups = Group::prepareListOnly()->get()->toArray();(empty($no)) {Response::json(array(

'students' => array(),

'groups' => $groups

));

}Response::json(array(

'students' => Students::where('group', '=', $no)->orderBy('last_name')->get()->toArray(),

'groups' => $groups

));

}

}

Приложение 4

Шаблон представления

<!DOCTYPE html>

<html lang="ru">

<head>

<meta charset="utf-8">

<meta name="viewport" content="width=device-width, initial-scale=1">

<title><% $title %></title>

<% HTML::style('packages/bootstrap/css/bootstrap.min.css') %>

<% HTML::style('css/main.css') %>

</head>

<body data-period="<% $monthStart . '-' . $monthEnd %>">

<nav>

<div>

<div>

<% HTML::link('/', 'Пропуски', array('class'=>'navbar-brand')) %>

</div>

<div>

<button type="button">

<span>

</button>

</div>

@section('fast-add')

@show

<ul>

<li>

<a href="#">

<b>

</a>

<ul>

@foreach($monthNames as $key=>$monthName)

@if ($key)

<li<% ($monthStart == $key) ? '>

<% HTML::link($baseLink . sprintf('%02d-%02d', $key, $monthEnd), $monthName) %>

</li>

@endif

@endforeach

</ul>

</li>

<li>

<a href="#">

<b>

</a>

<ul>

@foreach($monthNames as $key=>$monthName)

@if ($key)

<li<% ($monthEnd == $key) ? '>

<% HTML::link($baseLink . sprintf('%02d-%02d', $monthStart, $key), $monthName) %>

</li>

@endif

@endforeach

</ul>

</li>

</ul>

<p>

</div>

</nav>

@section('jumbotron')

@show

<div>

@section('panels')

@show

</div>

<div id="ajaxErrorModal">

<div>

<div>

<div>

<button type="button">

<h4>Ошибка сервера</h4>

</div>

<div>

</div>

</div>

</div>

</div>

<div id="groupEditor">

<div>

<div>

<div>

<button type="button">

<h4>Редактор групп</h4>

</div>

<div>

<div>

<input type="text">

<div>

<button type="button">

@if (!$groupList)="disabled"

@endiftoggle="dropdown">

Группы <span>

</button>

<ul>

@foreach($groupList as $groupItem)

<li><a href="#"><% $groupItem['group'] %></a></li>

@endforeach

</ul>

</div>

</div><!-- /.input-group -->

<hr>

<div>

<input type="text">

<div>

<button type="button">

</div>

</div>

<hr>

<div>

<div>

<button type="button">

<span>

</button>

</div>

<div>

<button type="button">

<button type="button">

</div>

</div>

<hr>

<div id="student-list"></div>

</div>

</div>

</div>

</div>

<% HTML::script('packages/jquery/jquery-2.1.0.min.js') %>

<% HTML::script('packages/bootstrap/js/bootstrap.min.js') %>

<% HTML::script('js/main.js') %>

</body>

</html>

Приложение 5

Представление группы

@extends('layouts.master')

@section('panels')

<div>

<div>

<div>

@if ($groupList)

@foreach($groupList as $groupItem)

<% HTML::link('group/' . $groupItem['group'],

$groupItem['group'], ('class'=>'list-group-item' . (($groupItem['group'] == $current) ? ' active' : null))) %>

@endforeach

@endif

</div>

</div>

<div>

@if($studentsList)

@foreach($studentsList as $id => $student)

<div>

<div>

<h4><% $student['name'] %>

<span>

<b><% $student['valids']['total'] + $student['invalids']['total'] %></b></span>

<span>

</h4>

</div>

<table>

<thead>

<tr>

<th></th>

@foreach($monthDays as $day => $dName)

<th>

<div><% $day %></div>

<div><% $dName %></div>

</th>

@endforeach

<th>

</tr>

</thead>

<tbody>

<tr>

<td>

@foreach($monthDays as $day => $dName)

<td>

<% Form::input('text', $day, ($student['valids'][$day]) ? $student['valids'][$day] : null,('class'=>'no-style', 'data-pass-day'=>$day, 'data-pass-type'=>'v',

'maxlength'=>'2')) %>

</td>

@endforeach

<td>

</tr>

<tr>

<td>

@foreach($monthDays as $day => $dName)

<td>

<% Form::input('text', $day, ($student['invalids'][$day]) ? $student['invalids'][$day] : null,('class'=>'no-style', 'data-pass-day'=>$day, 'data-pass-type'=>'i',

'maxlength'=>'2')) %>

</td>

@endforeach

<td>

</tr>

</tbody>

</table>

</div>

@endforeach

<!--<% var_dump($monthDays) %>-->

</div>

</div>

@stop

@section('fast-add')

<p>

<form>

<div>

<input type="text" name="student-fast-add-name">

</div>

<button type="submit">

</form>

@stop

@section('jumbotron')

<div>

<div>

<h1><% $current %> группа

<small> Период <% mb_strtolower($startMonthName) %> &ndash; <% mb_strtolower($endMonthName) %></small>

</h1>

<table>

<thead>

<tr>

<th></th>

<th><% $endMonthName %></th>

<th>Период</th>

<th><% $endMonthName %> на 1</th>

<th>Период на 1</th>

</tr>

</thead>

<tbody>

<tr>

<td><span>

<td id="v-month-cell"><% $basicData[0]['v_month'] ? $basicData[0]['v_month'] : 0 %></td>

<td id="v-per-cell"><% $basicData[0]['v_per'] ? $basicData[0]['v_per'] : 0 %></td>

<td id="v-month-mid-cell"><% $basicData[0]['v_month']

? round($basicData[0]['v_month'] / $basicData[0]['members'], 2) : 0 %></td>

<td id="v-per-mid-cell"><% $basicData[0]['v_per']

? round($basicData[0]['v_per'] / $basicData[0]['members'], 2) : 0 %></td>

</tr>

<tr>

<td><span>

<td id="i-month-cell"><% $basicData[0]['i_month'] ? $basicData[0]['i_month'] : 0 %></td>

<td id="i-per-cell"><% $basicData[0]['i_per'] ? $basicData[0]['i_per'] : 0 %></td>

<td id="i-month-mid-cell"><% $basicData[0]['i_month']

? round($basicData[0]['i_month'] / $basicData[0]['members'], 2) : 0 %></td>

<td id="i-per-mid-cell"><% $basicData[0]['i_per']

? round($basicData[0]['i_per'] / $basicData[0]['members'], 2) : 0 %></td>

</tr>

</tbody>

<tfoot>

<tr>

<td><strong>&#931;</strong></td>

<td id="s-month-cell"><% $basicData[0]['i_month'] + $basicData[0]['v_month'] %></td>

<td id="s-per-cell"><% $basicData[0]['i_per'] + $basicData[0]['v_per'] %></td>

<td id="s-month-mid-cell"><% ($basicData[0]['i_month'] + $basicData[0]['v_month'])

? round(($basicData[0]['i_month'] + $basicData[0]['v_month']) / $basicData[0]['members'], 2) : 0 %></td>

<td id="s-per-mid-cell"><% ($basicData[0]['i_per'] + $basicData[0]['v_per'])

? round(($basicData[0]['i_per'] + $basicData[0]['v_per']) / $basicData[0]['members'], 2) : 0 %></td>

</tr>

</tfoot>

</table>

</div>

</div>

@stop

Приложение 6

Представление - список групп

@extends('layouts.master')

@section('panels')

<div>

@if($absences)

@foreach($absences as $group)

<div>

<div>

<h2>

<% HTML::link('group/' . $group['group'], $group['group']) %>

</h2>

<table>

<thead>

<tr>

<th></th>

<th><% $currentMonth %></th>

<th>Период</th>

</tr>

</thead>

<tbody>

<tr>

<td><span>

<td><% $group['v_month'] ? $group['v_month'] : 0 %></td>

<td><% $group['v_per'] ? $group['v_per'] : 0%></td>

</tr>

<tr>

<td><span>

<td><% $group['i_month'] ? $group['i_month'] : 0%></td>

<td><% $group['i_per'] ? $group['i_per'] : 0%></td>

</tr>

</tbody>

<tfoot>

<tr>

<td><strong>&#931;</strong></td>

<td><% $group['v_month'] + $group['i_month'] %></td>

<td><% $group['v_per'] + $group['i_per'] %></td>

</tr>

</tfoot>

</table>

<p>

<% $group['members'] %> <% Lang::choice('студент|студентов|студента', $group['members']) %>

</p>

<table>

<thead>

<tr>

<th></th>

<th><% $currentMonth %></th>

<th>Период</th>

</tr>

</thead>

<tbody>

<tr>

<td><span>

<td><% round($group['v_month'] ? $group['v_month'] / $group['members'] : 0, 2) %></td>

<td><% round($group['v_per'] ? $group['v_per'] / $group['members'] : 0, 2) %></td>

</tr>

<tr>

<td><span>

<td><% round($group['i_month'] ? $group['i_month'] / $group['members'] : 0, 2) %></td>

<td><% round($group['i_per'] ? $group['i_per'] / $group['members'] : 0, 2) %></td>

</tr>

</tbody>

<tfoot>

<tr>

<td><strong>&#931;</strong></td>

<td>

<% round(($group['v_month']+$group['i_month'])

? ($group['v_month']+$group['i_month']) / $group['members'] : 0, 2) %>

</td>

<td>

<% round(($group['v_per']+$group['i_per'])

? ($group['v_per']+$group['i_per']) / $group['members'] : 0, 2) %>

</td>

</tr>

</tfoot>

</table>

</div>

</div>

@endforeach

@endif

</div>

@stop

Похожие работы на - Разработка базы данных учета пропусков учащихся и программы-клиента к ней

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!