Помощь в написании студенческих работ
Антистрессовый сервис

Разработка системы учета успеваемости студентов на основе рейтинговой системы — подсистема «Кафедра»

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Общую схему функционирования web-приложения можно представить следующим образом: пользователь запрашивает страницу через свой web-браузер. Web-браузер формирует HTTP-запрос и отправляет его серверу. Сервер анализирует запрос, далее он либо выдает запрошенный пользователем файл (картинка, статический HTML, flash-анимация), либо передает управление PHP-скрипту. Если пользователь ввел какие-либо… Читать ещё >

Разработка системы учета успеваемости студентов на основе рейтинговой системы — подсистема «Кафедра» (реферат, курсовая, диплом, контрольная)

  • Введение
  • 1 Формирование требований к программному средству
    • 1.1 Разработка диаграммы вариантов использования
      • 1.1.1 Выявление акторов
      • 1.1.2 Выявление вариантов использования
      • 1.1.3 Создание диаграммы вариантов использования
  • 2 Анализ предметной области
    • 2.1 Описание потоков данных
    • 2.2 Построение диаграммы потоков данных
  • 3 Проектирование программного средства
    • 3.1 Проектирование архитектуры программного средства
      • 3.1.1 Шаблон MVC
      • 3.2 Проектирование структуры информационного обеспечения
    • 3.3 Проектирование интерфейса программного средства
  • 4 Реализация программного средства
    • 4.1 Выбор средств реализации
    • 4.2 Реализация информационного обеспечения
    • 4.3 Реализация пользовательского интерфейса
    • 4.4 Реализация функциональности программного средства
    • 4.5 Организация взаимодействия приложения с базой данных.
    • 4.6 Справочная система
  • 5 Тестирование программного средства
  • Заключение
  • Приложение А. Введение
  • Приложение Б. Диаграмма потоков данных
  • Приложение В. ER-диаграмма
  • Приложение Г. Исходный код
  • Введение

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

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

1 Формирование требований к программному средству При создании программного средства для новых, плохо компьютеризированных областей разработчик сталкивается с проблемой формализации требований к ПС. На этом этапе необходима слаженная работа заказчика и разработчика, результатом которой является определение требований и задач программного средства. Требования к программному средству оформляются в виде набора документов. Один из документов — «Видение» представлен в приложении А.

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

1.1.1 Выявление акторов Краткое описание акторов представлено в таблице 1.

Таблица 1. Выявление акторов.

Актор

Краткое описание

Администратор

Имеет полный доступ к системе. Переносит структуру ВУЗа в ПС. Создает и удаляет учетные записи других пользователей в системе. Может замещать других акторов, в случае их отсутствия.

Администратор кафедры

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

Преподаватель

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

1.1.2 Выявление вариантов использования

Вариант использования

Краткое описание

Акторы

Создание структуры факультетов и кафедр

Создается структура факультетов и кафедр ВУЗа

Главный администратор

Создание структуры специальностей и учебных групп

Создается структура специальностей и учебных групп для конкретной кафедры

Главный администратор, администратор кафедры

Получение статистики по кафедре

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

Главный администратор, Администратор кафедры

Добавление учебных работ и оценок студентов

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

Главный администратор, Администратор кафедры, Преподаватель

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

Позволяет пользователю получить данные о рейтинге студентов/групп

Главный администратор, Администратор кафедры, Преподаватель

1.1.3 Создание диаграммы вариантов использования

На основе сформированных таблиц построим диаграмму вариантов использования. Диаграмма представлена на рисунке 1.

Рис. 1. Диаграмма вариантов использования

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

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

Опишем данные системы в виде диаграммы потоков данных (data flows diagram). Для этого определим потоки данных, объекты и хранилища.

2.1 Описание потоков данных

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

Администратор имеет права на полный доступ к системе. Он может добавлять, удалять и изменять данные в хранилищах.

Администратор кафедры имеет права на доступ к системе на уровне кафедры и ниже — редактирование специальностей, групп, предметов и т. д.

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

2.2 Построение диаграммы потоков данных

На основе приведенного описания построим диаграмму потоков данных. Диаграмма потоков данных схематично представлена в приложении Б.

3 Проектирование программного средства

3.1 Проектирование архитектуры программного средства

Общую схему функционирования web-приложения можно представить следующим образом: пользователь запрашивает страницу через свой web-браузер. Web-браузер формирует HTTP-запрос и отправляет его серверу. Сервер анализирует запрос, далее он либо выдает запрошенный пользователем файл (картинка, статический HTML, flash-анимация), либо передает управление PHP-скрипту. Если пользователь ввел какие-либо данные в форму, то они передаются в скрипт как параметры. В зависимости от запрошенных данных скрипт может обращаться к серверу баз данных и получать данные из БД. Затем скрипт формирует HTML-страницу и передает ее web-серверу, а тот, в свою очередь, возвращает страницу браузеру пользователя через HTTP. Концептуальную схему этого процесса можно увидеть на рисунке 2.

Рис. 2. Общая схема функционирования web-приложения

Из рисунка мы видим, что анализ введенных пользователем данных, работа с БД и формирование страницы ответа происходит в одном PHP скрипте. Такой подход крайне неудобен. При небольшом изменении дизайна страницы или структуры базы данных затрагивается весь скрипт. Кроме того, такой подход неудобен для разделения труда между программистами и дизайнерами.

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

3.1.1 Шаблон MVC

Для отделения логической структуры и реализации компонентов ПС будет применен шаблон проектирования (паттерн) программного обеспечения model-controller-view. Суть его заключается в том, что ПС разделяется на три независимых компонента :

· Модель (Model). Модель предоставляет данные (обычно для View), а также реагирует на запросы (обычно от контролера), изменяя свое состояние.

· Представление (View). Отвечает за отображение информации (пользовательский интерфейс).

· Поведение (Controller). Интерпретирует данные, введенные пользователем, и информирует модель и представление о необходимости соответствующей реакции.

Рис. 3. Структура MVC

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

Для уточнения взаимодействия компонентов архитектуры MVC приведем диаграмму последовательностей UML.

Рис. 3. Диаграмма последовательностей архитектуры MVC

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

Для отображения структуры ВУЗа необходим набор таблиц для хранения факультетов, кафедр, специальностей, групп и студентов. Эти таблицы будут организованы иерархически.

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

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

Интерфейс нашего ПС будет состоять из 4х основных блоков:

1. Заголовок (Хэдер). Содержит картинку и название ПС.

2. Нижняя часть (Футер). Содержит копирайт.

3. Блок меню слева. Содержит меню с основной навигацией системы.

4. Блок содержимого (контент). В нем будет отображаться основное содержимое.

Структура блоков показана на рисунке 4.

Хэдер

Меню

Контент

Футер

Рис. 4. Структура интерфейса программного средства При проектировании интерфейса нужно так же учесть следующее:

· Активные элементы интерфейса (ссылки, кнопки) должны выделяться и контрастировать со статическими.

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

· Интерфейс должен быть прост и не перегружен лишними элементами.

4 Реализация программного средства

4.1 Выбор средств реализации

Для реализации нашей задачи нам необходима система клиент-сервер с централизованным хранением данных успеваемости и разграничением доступа к этим данным. Для этого была выбрана платформа Web, с использованием языка PHP, веб-сервера Apache и сервера баз данных MySql.

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

· Централизованное хранение данных об успеваемости учащихся и распределенный доступ к этим данным.

· Логика разграничения доступа храниться на сервере, что повышает безопасность системы.

· Относительная легкость установки и разворачивания серверной части.

· Нет необходимости в специальной клиентской части — доступ к системе можно получить из любого web-браузера.

· Возможность получения доступа, откуда угодно посредством сети Интернет (в т. ч. с мобильных устройств) Веб-сервер Apache является одним из самых распространенных серверов. Он установлен на более чем 80% всех интернет-серверов и является стандартом де-факто в этой сфере. Установка и настройка сервера хорошо документирована. Кроме того, существую дистрибутивы для всех распространенных ОС, таких как Windows, Unix и Linux.

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

Связка PHP-MySql используется повсеместно и хорошо зарекомендовала себя своей скоростью и производительностью. Кроме того, PHP имеет встроенные средства для работы с данным сервером баз данных и установка дополнительных компонентов не требуется.

PHP 5 является удобным, платформонезависимым, интерпретируемым ООП-языком, с самым большим репозитарием кода на сегодняшний день. Язык PHP очень гибок и позволяет быстро и просто реализовывать алгоритмы обработки данных, которые потребовали бы написания отдельных сложных функций и классов в других языках.

Еще один важный критерий выбора данных средств — независимость от платформы конечного кода и структуры БД системы: веб-приложение, созданное под ОС Windows легко, без изменений переносится на платформу Linux/Unix.

4.2 Реализация информационного обеспечения Для создания физической структуры БД было использовано средство phpMyAdmin, которое является административной утилитой серверов MySql, написанной на PHP.

Создание структуры происходит следующим образом:

· с помощью phpMyAdmin создается новая база данных, определяются имена пользователей и пароли для доступа к БД, если это необходимо

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

· осуществляется создание таблицы в phpMyAdmin

· процесс повторяется для всех таблиц в структуре БД

· при создании представления проектируется SQL запрос к БД, производится тестирование его на правильность полученных данных, а затем создание представления с помощью специального средства phpMyAdmin

4.3 Реализация пользовательского интерфейса Пользовательский интерфейс реализуется путем отделения HTML-кода от кода программного средства, и использования прослойки — библиотеки-шаблонизатора. Для нашей системы была выбрана библиотека Smarty.

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

Создание шаблона происходит следующим образом: в текстовом редакторе создается и редактируется HTML-страница нужной нам структуры, затем в код страницы вводятся специальные Smarty-теги, ответственные за отображение активного контента. Такие теги имеют вид: {тег [параметр …]} для управляющей структуры, например if, for, или foreach. Тег {$переменная} выведет значение переменной в место, где он расположен. Так, например тег {$content} выведет значение переменной $content.

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

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

В нашей системе присутствует большое количество страниц, осуществляющих вывод списковых данных (факультеты, кафедры, группы и т. д.). Создание отдельного шаблона для каждой такой страницы нецелесообразно, поэтому был создан универсальный шаблон list.tpl. Этот шаблон принимает не конкретные, а общие данные списка — количество и название полей для отображения, таблицу со значениями полей, ссылки для редактирования/добавления/изменения данных (если есть) и прочее. Большинство страниц выводится с применением именно этого шаблона.

Конечный пользовательский интерфейс представлен на рисунке 5.

Рис. 5. Скриншот ПС

4.4 Реализация функциональности программного средства Функциональность нашего программного средства реализуется с помощью нескольких классов. Кратко опишем их:

1) Класс Registry. Реализует общий реестр приложения, в котором хранятся все экземпляры классов, глобальные переменны и прочее. Данный класс был создан с использованием шаблона проектирования «Синглтон». Этот шаблон гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа. Таким образом, мы можем получить экземпляр класса Registry из любой точки нашей программы. Использование реестра в ПС предотвращает засорение глобальной области видимости переменными.

Для предотвращения создания экземпляра класса, его конструктор описан с ключевым словом private, запрещающим доступ к конструктору извне:

private function __construct ()

{}

Тот же подход используется для предотвращения клонирования экземпляра класса:

private function __clone ()

{}

Метод getInstance () предназначен для возвращения единственного экземпляра класса, который хранится в статическом поле $_instance. Если экземляр еще не создан (в случае первого вызова getInstance), то он создается:

public static function getInstance ()

{

if (!self:$_instance) {

self:$_instance = new self;

}

return self:$_instance;

}

Все данные хранятся в поле-массиве $vars.

Кроме того, данный класс реализует два интерфейса: ArrayAccess и Iterator. Это позволяет использовать экземпляр класса в качестве объекта перечисления, а также обращаться к классу как к массиву, что очень удобно для нашей задачи. Класс реализует следующие методы, описанные в интерфейсе ArrayAccess: set (), get (), remove (), offsetExists (), offsetGet (), offsetSet (), offsetUnset () и методы, описанные в интерфейсе Iterator: rewind (), current (), key (), next (), valid (). При обращении с объектом как с массивом PHP ищет реализацию этих методов и прозрачно вызывает их. Вместо

$registry->set ('key', 'value');

мы вызываем

$registry['key'] = 'value';

2) Класс lib. Содержит в себе общие библиотечные функции, которые могут использоваться вне контекста нашей системы. Класс полностью статический, т. е. не требует (и даже запрещает) создания экземпляра класса для использования. Класс используется в качестве пространства имен, объединяющего в себе наиболее общие функции. Это делается для предотвращения смешивания разных парадигм программирования в одном программном средстве и во избежание потери гибкости при использовании классов. Класс lib реализует следующие методы:

· datestr_to_timestamp () — преобразует дату формата 'дд-мм-гггг' в метку времени Unix.

· get_script_url () — Возвращает абсолютный адрес вызывающего скрипта. Метод вызывается один раз в файле index. php для определения URL нашего скрипта, для последующего построения всех ссылок.

· get_options () — метод принимает в качестве параметра массив, содержащий полученную из БД таблицу и возвращает HTML-код для заполнения тега
';

$params = array ('full'=>$full, 'edit'=>site_url.'facults/edit', 'del'=>site_url.'facults/del',

'table'=>$table, 'fields'=>$fields, 'widths'=>$widths, 'add'=>site_url.'facults/add', 'add_form'=>$add_form);

$registry['title'] = 'Список факультетов';

$registry['tpl_params'] = $params;

$registry['help'] = 'Здесь представлен список факультетов ВУЗа.

Администратор может добавлять, удалять и редактировать названия факультетов';

}

function del ()

{

$registry = $this→registry;

if (!$registry['access']→get_privilege ('edit_facults_priv')) $registry['access']→restrict ();

$id = (int)$this→args[0];

if ($id≤0) return;

if (!lib:is_childless ('facults', $id)) {$registry['message'] = 'Невозможно удалить. Сначала удалите

дочерние элементы. Назад'; return;}

if (!isset ($this→args[0])) return;

$DB = $registry['DB'];

$DB→query ('DELETE FROM `facults` WHERE id=? LIMIT 1', $id);

lib:redirect (site_url.'facults');

}

function edit ()

{

$registry = $this→registry;

if (!$registry['access']→get_privilege ('edit_facults_priv')) $registry['access']→restrict ();

if (!isset ($this→args[0])) return;

$DB = $registry['DB'];

$id = (int)$this→args[0];

if ($id≤0) return;

$table = $DB→select ('SELECT * FROM facults WHERE id=? LIMIT 1', $id);

$name = $table[0]['name'];

if (empty ($_POST['name']))

{

$smarty = $registry['smarty'];

//$smarty→assign ('name', $name);

$edit_form = 'Название:
';

//$smarty→assign ('fields', array ('Название'=>'name'));

//$smarty→assign ('values', array ('name'=>$name));

$smarty→assign ('edit_form', $edit_form);

$smarty→display ('popup_edit.tpl');

exit ();

}

else

{

$name = $_POST['name'];

$DB→query ('UPDATE `facults` SET name=? WHERE id=? AND NOT name=?',$name, $id, $name);

echo lib: reload_caller_js ();

exit ();

}

//$registry['message'] = 'Редактируем '.$id;

}

function add ()

{

if (!isset ($_POST['name'])) return;

$name = $_POST['name'];

$registry = $this→registry;

if (!$registry['access']→get_privilege ('edit_facults_priv')) $registry['access']→restrict ();

$DB = $registry['DB'];

$res = $DB→query ('INSERT INTO `facults` (name) VALUES (?)', $name);

if (!$res)

{

$registry['message'] = 'Ошибка добавления';

return;

}

lib:redirect (site_url.'facults');

}

}

?>

Class Router {

private $registry;

private $path;

private $args = array ();

function __construct () {

$this→registry = Registry: getInstance ();

}

function setPath ($path) {

$path = trim ($path, '/\');

$path .= DIRSEP;

if (is_dir ($path) == false) {

throw new Exception ('Invalid controller path: `'. $path. '`');

}

$this→path = $path;

}

/**

* Получает данные о контроллере

*

* @param string $file Имя файла контроллера

* @param string $controller Имя контроллера, по умолчанию 'index'

* @param string $action Имя действия, по умолчанию 'index'

* @param array $args Массив аргументов, переданных через URL

* @return void

*/

private function getController (&$file, &$controller, &$action, &$args) {

$route = (empty ($_GET['route']))? '': $_GET['route'];

if (empty ($route)) { $route = 'index'; }

// Хак! Если пользователь не вошел кидаем на вход

if (!@$_SESSION['auth']) $route = 'user/login';

// Получаем раздельные части

$route = trim ($route, '/\');

$parts = explode ('/', $route);

// Находим правильный контроллер

$cmd_path = $this→path;

foreach ($parts as $part) {

$fullpath = $cmd_path. $part;

// Есть ли папка с таким путём?

if (is_dir ($fullpath)) {

$cmd_path .= $part. DIRSEP;

array_shift ($parts);

continue;

}

// Находим файл

if (is_file ($fullpath. '.php')) {

$controller = $part;

array_shift ($parts);

break;

}

}

if (empty ($controller)) { $controller = 'index'; };

// Получаем действие

$action = array_shift ($parts);

if (empty ($action)) { $action = 'index'; }

$file = $cmd_path. $controller. '.php';

$args = $parts;

}

function delegate () {

// Анализируем путь

/**

* @var string $file

*/

$file = $controller = $action = $args = '';

$this→getController ($file, $controller, $action, $args);

// Файл доступен?

if (is_readable ($file) == false) {

die ('404 Not Found');

}

// Подключаем файл

include ($file);

// Создаём экземпляр контроллера

$class = 'Controller_'. $controller;

$controller = new $class ($this→registry);

// Действие доступно?

if (is_callable (array ($controller, $action)) == false) {

die ('404 Not Found');

}

// Выполняем действие

$controller→args = $args;

$controller→$action ();

}

}

?>

class Registry implements ArrayAccess, Iterator

{

private $vars = array ();

/**

* @var Registry

*/

public static $_instance;

private function __construct (){

}

/**

* Возвращает экземпляр класса

*

* @return Registry

*/

public static function getInstance ()

{

if (!self:$_instance) {

self:$_instance = new self;

}

return self:$_instance;

}

function set ($key, $var) {

/*if (isset ($this→vars[$key]) == true) {

throw new Exception ('Unable to set var `'. $key. '`. Already set.');

}*/

$this→vars[$key] = $var;

return true;

}

function get ($key) {

if (isset ($this→vars[$key]) == false) {

return null;

}

return $this→vars[$key];

}

function remove ($key) {

unset ($this→vars[$key]);

}

function offsetExists ($offset) {

return isset ($this→vars[$offset]);

}

function offsetGet ($offset) {

return $this→get ($offset);

}

function offsetSet ($offset, $value) {

$this→set ($offset, $value);

}

function offsetUnset ($offset) {

unset ($this→vars[$offset]);

}

public function rewind () {

reset ($this→vars);

}

public function current () {

$var = current ($this→vars);

return $var;

}

public function key () {

$var = key ($this→vars);

return $var;

}

public function next () {

$var = next ($this→vars);

return $var;

}

public function valid () {

$var = $this→current () ≠= false;

return $var;

}

}

?>

Показать весь текст
Заполнить форму текущей работой