Автоматизация учебного процесса с помощью программных средств

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 27.06.2011
Размер файла 6,1 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

35. Фамолинова Е.В. Физическое напряжение на работе. //Здоровье, 1995. - №12. С.-23-27.

36. Вендров А.М. Проектирование программного обеспечения экономических информационных систем: Учебник. - М.: Финансы и статистика, 2002

37. Фридман А.Л. Основы объектно-ориентированной разработки программных систем. - М.: Финансы и статистика, 2000.

38. Фатрелл, Р. Управление программными проектами: достижение оптимального качества при минимуме затрат / Р. Фатрелл, Д. Шафер, Л. Шафер. - М.: Вильямс, 2003.

ПРИЛОЖЕНИЕ А

ТЕХНИЧЕСКОЕ ЗАДАНИЕ

1 Введение

1.1 Наименование программы

Наименование - "Web-сайт учебного процесса" (далее по тексту - сайт)

1.2 Краткая характеристика области применения

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

2 Основание для разработки

2.1 Основание для проведения разработки

Основания для разработки Программы - задание на бакалаврский проект кафедры "Компьютерные системы и сети" Национального аэрокосмического университета им. Н.Е. Жуковского "ХАИ"

2.2 Наименование и условное обозначение разработки

Наименование темы разработки - "Разработка Web-сайта учебного процесса"

Условное обозначение темы разработки(шифр темы) - " ".

3 Назначение разработки

3.1 Функциональное назначение разработки

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

3.2 Эксплуатационное назначение

Сервер

Сайт должен работать под управлением сервера Sun Application Server 9.0 или Glassfish v2, базы данных MySQL 5.0. Программа является кросс-платформенной, поэтому может функциональность от операционной системы не изменится, изменения в отображении будут видны только в графическом представлении. Данная версия апробирована только под Windows(XP/Vista).

Клиент

Для доступа к сайту достаточно иметь Интернет и браузер, например Internet Explorer (6/7), Firefox Mozilla.

4 Требования к программе или программному изделию

4.1 Требования к функциональным характеристикам

4.1.1 Требования к составу выполняемых функций

Сайт должен выполнять функции:

а) иметь возможность авторизации и аутентификации пользователей;

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

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

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

д) возможность просмотра информации о высшем учебном заведении, его преподавателей;

е) функция отправки и получения писем "преподаватель-студент";

ж) возможность просмотра расписания занятий на текущий семестр;

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

4.1.2 Требования к организации выходных данных

Выходные данные должны быть представлены в HTML виде, так как должны быть способны отображаться в браузерах. Также возможно использование JavaScript кода и Flesh.

4.1.3 Требования к временным характеристикам

Требования к временным характеристикам не предъявляются.

4.2 Требования к надёжности

Программа относится к классу WEB-программ. Программа запускается на стороне сервера и поэтому к её надёжности предъявляются специальные требования.

4.2.1 Требования к обеспечению надёжного(устойчивого) функционирования программы

Надежное (устойчивое) функционирование программы должно быть обеспечено выполнением Заказчиком совокупности организационно-технических мероприятий:

а)организацией бесперебойного питания технических средств;

б)использованием лицензионного программного обеспечения;

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

Надежное (устойчивое) функционирование Программы должно быть обеспечено выполнением Исполнителем совокупности требований, предъявляемых к проектированию демонов:

г) в случае ошибки, возникшей при работе Программы, сообщения об ошибках отправляются на почту;

д) предусмотреть меры по исключению утечек памяти;

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

4.2.2Отказы из-за некорректных действий оператора

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

4.2.3 Требования к обеспечению надёжного функционирования программы

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

Возможные отказы в работе сайта по ее вине не должны приводить к потере данных в базе данных.

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

Допускается требование перезагрузки ОС после отказа Программы.

4.2.4 Время восстановления после отказа

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

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

4.3 Условия эксплуатации

4.3.1 Климатические условия эксплуатации

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

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

4.3.2Требования к видам обслуживания

После установки на сервер программа не требует обслуживания.

4.3.3Требования к численности и квалификации персонала

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

Системный администратор должен иметь высшее профильное образование и сертификаты компании-производителя операционной системы. Перечень задач, выполняемых системным администратором:

а)поддержание работоспособности технических средств;

б)установка (инсталляция) и поддержание работоспособности системных программных средств операционной системы;

в) настройка базы данных и сервера, их поддержка.

г) установка(инсталляция) необходимого программного обеспечения

Конечный пользователь на стороне клиента сайта должен обладать практическими навыками работы в Интернете.

Персонал на стороне сервера должен быть аттестован на II квалификационную группу по электробезопасности (для работы с конторским оборудованием).

4.4 Требования к составу и параметрам технических средств

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

Сервер

а) процессор с тактовой частотой, ГГц - 3, не менее;

б) материнскую плату с FSB, МГц - 330, не менее;

в) оперативную память объемом, Гб -1, не менее;

г) свободное дисковое пространство для хранения программы и установки необходимого программного обеспечения, Гб - 2, не менее;

д) отдельно дисковое пространство под базу данных, Гб - не менее 2 Гб.

е) дисплей и видеоадаптер любого типа, позволяющий отображать информацию в текстовом режиме;

ж) клавиатуру;

з) НЖМД;

и) сетевую плату;

к) выход в Интернет.

Клиент

а) процессор с тактовой частотой, MГц - 800, не менее;

б) материнскую плату с FSB, МГц - 330, не менее;

в) оперативную память объемом, Mб -64, не менее;

г) свободное дисковое пространство для хранения программы и установки необходимого программного обеспечения , Mб -50 , не менее;

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

е) клавиатуру;

ж) НЖМД;

з) сетевую плату;

и) выход в Интернет.

4.5 Требования к информационной и программной совместимости

4.5.1 Требования к информационным структурам и методам решения

Требования к информационным структурам на входе и выходе, а также к методам решения не предъявляются.

4.5.2 Требования к исходным кодам и языкам программирования

Для разработки серверной части сайта в качестве языка программирования нужно использовать язык Java поддерживающий спецификацию компании производителя Sun. Серверная часть программного обеспечения должна безошибочно компилироваться с помощью Ant'a или встроенными средствами среды разработки.

Проект необходимо держать под контролем версии SVN для возможности работы над проектом командой.

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

Дополнительные настройки компиляторов не требуются.

В качестве среды разработки необходимо использовать NetBeans 6.0.

4.5.3 Требования к программным средствам, используемым программой

Для функционирования серверной части программы на компьютере должно быть установлено следующее ПО:

- ОС Microsoft XP/Vista;

- программный сервер - Sun Application Server 9.0 или Glassfish v2.0 не ниже

- установлены библиотеки для работы с EJB3.0

- установлены библиотеки для работы с WebUI

- виртуальная машина jdk 1.5.0_13

- среда разработки NetBeans6.0

- сервер баз данных - MySQL 5.0

4.5.4 Требования к защите информации и программ

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

4.6 Специальные требования

Специальных требований к сайту не имеется.

5 Требования к программной документации

5.1 Предварительный состав программной документации

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

а) техническое задание;

б) схемы алгоритмов и данных;

в) тексты программ;

г) план тестирования и верификации;

д) пояснительная записка;

е) руководство оператора;

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

ПРИЛОЖЕНИЕ Б

РУКОВОДСТВО СИСТЕМНОГО АДМИНИСТРАТОРА.

Б.0 ВВЕДЕНИЕ

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

Б.1 ПРЕДВАРИТЕЛЬНЫЕ ТРЕБОВАНИЯ

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

1) MySQL 5.0.21

2) MySQL Administrator 1.1.9;

3) MySQL Query Browser 1.1.20;

4) JDK 1.5.0.13

5) JRE 1.5.0.13

6) Glassfishv2

7) NetBean6.0

8) Apache Ant 1.7.1

9) Настройка JMS соединения на web сервере.

10) Добавление jxl.jar, jstl.jar библиотек в Application модуль. Установка связей между ejb и web модулями.

Б.2 НАСТРОЙКА СУБД

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

1. Создание учётной записи в базе данных

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

Рисунок Б.2 Добавление нового хоста

Рисунок Б.1 Добавление нового пользователя

Рисунок Б.3Задание IP-адреса хоста

2. Задание пользователю имени авторизации и пароля

Рисунок Б.4 Создание имя авторизации и пароля пользователю

3. Создание схемы

Рисунок Б.5 Создание новой схемы

Рисунок Б.6 Именование схемы

4 Добавление привилегии таблицам

Рисунок Б.7 Присвоение прав пользователю на работы со схемами

Б.3 НАСТРОЙКА ВЕБ СЕРВЕРА

1. Создание WEB-сервера

Рисунок Б.8 Создание WEB-сервера

2. Создание домена WEB-сервера

Рисунок Б.9Выбор типа WEB-сервера

Рисунок Б.10 Создание имени авторизации и пароля для доступа к консоли WEB-сервера

Рисунок Б.11 Создание расположения домена WEB-сервера

6. Создание нового сервера баз данных:

Рисунок Б.12 Создание новой связи с базой данных

Рисунок Б.13 Выбор базы данных

Рисунок Б.14 Создание URL-адреса схемы базы данных

7 Запуск приложения на выполнение:

Рисунок Б.15 Запуск приложения на выполнение

На этом этапе создадутся таблицы в базе данных

Рисунок Б.16 Архитектура схемы university

8. Создание системных переменных

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

Рисунок Б.17 Свойства системы

Внутри этой странички нажать кнопку "Переменные среды", после чего появится соответствующее окошко. В нём надо в панели системных переменных нажать на кнопку "Создать". После чего в окне "Изменение системной переменной" внести необходимую информацию: в поля имени переменной указать ANT_HOME, а в значении - абсолютный путь. После этого изменить значение Path, добавивши в конец значения через точку с запятой ANT_HOME\bin.

Рисунок Б.18. Переменные среды

9. Создание JMS PTP соединения.

Заходим в левой части панели среды разработки на меню Services, в появившемся древовидном списке выбираем Servers->GlassFish V2.

Рисунок Б.19. Закладка Services в среде NetBeans 6.0

Нажимаем на нём правой кнопкой мыши и выбираем View Admin Console. После этого в браузере откроется консоль.

Рисунок Б.20. Консоль GlassFish WEB-сервера. Логин страница

Вводим те данные логин и пароль, которые мы указывали при установке GlassFish'a. После чего нам откроется страница со всеми возможностями управления сервером.

Рисунок Б.21. Консоль GlassFish WEB-сервера. Главная страница.

Во всём этом разнообразии нас интересуют ресурсы, а именно JMS ресурсы. В нём есть две папочки - Connection Factories и Destination Resources. При создании записи в Connection Factories, данные должны соответствовать рисунку Б.3.16, а Destination Resources рисунку Б.3.17.

Рисунок Б.22. JMS Connection Factory

Рисунок Б.23 JMS Destination Resources

10. Добавление библиотек в проект

Добавляем необходимые библиотеки для проекта. Для этого в закладке Projects правой кнопкой мыши щёлкаем на UniversityPortal и выбираем в консольном меню Properties.

Рисунок Б.24. Закладка Projects в среде разработки NetBeans 6.0

В новом окне выбираем Libraries категории при помощи кнопки "Add Jar/Folder…" указываем пути к jxl.jar, mysql-connector-java-5.0.7-bin.jar библиотекам. Таким же способом, только для модуля UniversityPortal-war указываем путь к jstl.jar.

Рисунок Б.25. Свойства проекта.

Б.4 АВТОМАТИЧЕСКОЕ ЗАПОЛНЕНИЕ СУБД НАЧАЛЬНЫМИ ДАННЫМИ

Для того, чтобы их инициализировать начальными данными, необходимо зайти на страницу http://<host_ip>:3306/UniversityPortal-war/faces/init.jsp и нажать появившуюся кнопку "init".

Рисунок Б.26. Страница инициализации базы данных

ПРИЛОЖЕНИЕ В

РУКОВОДСТВО ОПЕРАТОРА

1. Авторизация в системе

Для того, чтобы авторизоваться на сайте, необходимо зайти на страницу авторизации http://host_ip:8081/UniversityPortal-war/, и ввести свои данные (Рисунок В.1), где host_ip - ip адрес сервера, на котором запущен данный сервер

Рисунок В.1. Страница авторизации пользователей

При успешной авторизации, в зависимости от роли пользователю откроются разные страницы:

- если администратор (рис В.2)

Рис В.2. Главная страница административной консоли приложения

- если студент, гость, преподаватель (рис 4.4.12):

Рисунок В.3. Главная страница портала.

2. Добавление пользователей

Для того чтобы добавить нового пользователя, надо нажать на ссылку "Добавити особу", после этого откроется страница с формой заполнения данных (рис В.4).

Рисунок В.4. Страница редактирования/добавления пользователей.

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

3. Редактирование пользователей

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

Рисунок В.5. Ошибка при попытке редактирования/удаления записи таблицы, не выбравши строку.

Такая же инструкция для удаления пользователя. Для смены пароля, необходимо его выбрать, нажать на ссылку "Змінити пароль", после этого откроется соответствующая страница (Рисунок В.6).

Рисунок В.6. Страница изменения пароля пользователя

4. Фильтр отображаемых пользователей в таблице

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

Рисунок В.7. Указание расположения фильтра на административной консоли

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

5. Администрирование сущностей

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

Рисунок В.8. Интерфейс однотипных страниц в административной консоли

После этого нам отобразится однотипная страница (РисунокВ.8.), только с таблицами, содержащими различного содержания данными, соответствующего названию страницы.

Рисунок В.9. Страница редактирование специальностей/кафедр.

При добавлении, либо редактировании записи в таблице, появится дополнительная форма, для ввода/редактирования данных. Страница "Редагування кафедр" (Рисунок В.9) позволяет редактировать данные, как кафедр, так и специальностей, посредством ниспадающего меню, расположенного в верхней части страницы.

6. Администрирование общих стандартов высшего учебного заведения

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

Рисунок В.10. Страница для редактирования корпусов ВУЗ'а и установление времени для каждой пары.

Внутри этой страницы (Рисунок В.10) есть две ссылки на две страницы.

Рисунок В.11 Страница для задания специфических значений каждому из корпусов университета.

При переходе через "Адмініструвати кабінети" мы попадаем на страницу (Рисунок В.11), где можно редактировать количество этажей каждого корпуса, количество кабинетов на каждом этаже и вместимость каждого кабинета.

Рисунок В.12 Страница, позволяющая импортировать данные о расписании из excel файла, и предоставляющая возможность привязки преподавателей к предметам.

Используя ссылку "Адмініструвати уроки" открывается страница (Рисунок В.12) позволяющая импортировать данные о расписании через *.xls документ. Перед этим, необходимо установить с какой верхней левой ячейки в этом файле находятся данные, также количество групп в этом документе и количество учебных дней в неделе. После этого необходимо составить excel файл в следующем формате:

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

Рисунок В.13 Пример оформления расписания в необходимом, для распознавания программы анализатора, портала формате.

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

7 Установление прав преподавателям на чтение дисциплин

При заходе на страницу редактирования предметов, через ссылку "Адміністрування дисциплін" (рис В.14) с главной страницы консоли, возможен также способ установления прав преподавателю на чтение дисциплин. Для этого выбираем интересующего нас преподавателя в списке ниспадающего меню "Викладачі", после этого выбираем предметы, которые преподаватель может вести, и нажимаем кнопку "Присвоїти".

Рисунок В.14 Страница изменения информации о читаемых предметах в университете. А также делегирования прав преподавания преподавателями этих дисциплин.

8 Преподавательский состав высшего учебного заведения

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

Гость кроме этого может посмотреть преподавательский состав и новости. Для этого есть два соседних с выбранной по умолчанию закладкой (Об університеті) "Викладачі унівеситету" и "Новини" соответственно.

Рисунок В.15 Страница всех преподавателей университета

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

9. Новости

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

Рисунок В.16 Страница новостей портала

10. Об университете

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

Рисунок В.17. Главная страница портала, при авторизации ролью студента.

11. Своя страница

Если зайти на портал под студентом или преподавателем появляется дополнительная закладка ("Своя сторінка") и 3 кнопки навигации ("Estimations", "Література" и "Скласти тести"), из кнопок для студента видимой есть только "Література" (Рисунок В.17).

Рисунок В.18. Представление внутренних вкладок вкладки "Своя сторінка"

При заходе на вкладку "Своя сторінка", появляется возможность выбрать одну из 5 появившихся вкладок ("Розклад", "Важливі повідомлення", "Успішність", "Отримані повідомлення" и "Відправити повідомлення"), как показано на рисунке В.18.

11.1 Страница расписания занятий

Рисунок В.19. Расписание занятий студента на текущий семестр

Первая закладка "Розклад" (Рисунок В.19) показывает расписание на текущий семестр.

11.2 Страница уведомлений

Рисунок В.20. Страница важных сообщений

На второй закладке "Важливі повідомлення" (Рисунок В.20) можно посмотреть важные сообщения, отправленные преподавателями.

11.3 Страница успеваемости студента в текущем семестре

Рисунок В.21. Успеваемость студента в текущем семестре

На закладке "Успішність" (Рисунок В.21) студент может посмотреть свою текущую успеваемость и посещаемость.

11.4 Страница полученных сообщений

РисунокВ.22. Полученные сообщения

На закладке "Отримані повідомлення" (Рисунок В.22) можно просмотреть пришедшие сообщения.

Рисунок В.23. Результат нажатия кнопки "Показати"

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

Рисунок В.24 Результат нажатия кнопки "Зберегти"

Если сообщения является необходимым в будущем, его можно сохранить, нажав кнопку "Зберегти". После чего оно исчезнет из колонки "Отримані повідомлення" и появится в колонке "Збережені повідомлення" (Рисунок В.24). Если письмо оставить в "Отримані повідомлення", то после 7 дней оно автоматически удалится.

11.5. Страница отправки сообщений

Рисунок В.25. Страница отправки сообщений

На закладке "Відправити повідомлення" (Рисунок В.25) можно отправить письмо студенту/преподавателю, в зависимости от того, какой пользователь пишет письмо. Для этого в ниспадающем меню "Отримувач" необходимо выбрать требуемого человека, написать тему письма в "Тема листа" и само сообщение в "Зміст листа". Для того, чтобы сделать письмо важным для получателя, необходимо поставить галочку напротив "Термінове".

12. Страница оценивания студентов.

Используя кнопки "Виставити відмітки", "Література" и "Скласти тести" можно проставить оценки студентам, посмотреть/редактировать/добавить литературу на портал и посмотреть/редактировать/добавить тесты. Из этих трёх кнопок, для студентов видна лишь одна - "Література".

Рисунок В.26. Выставление оценок студентам. Шаг 1

Рисунок В.27. Выставление оценок студентам. Шаг 2

Рисунок В.28. Выставление оценок студентам. Шаг 3

Рисунок В.29. Выставление оценок студентам. Шаг 4

Рисунок В.30. Выставление оценок студентам. Шаг 5

При переходе на страницу "Виставити відмітки" (Рисунок В.26) для того, чтобы увидеть таблицу со студентами какой-то группы (рисю В.29), необходимо выбрать группу (Рисунок В.27), предмет и занятие (Рисунок В.28). После этого откроется таблица со всеми студентами в ней и оценками/посещаемостью данного урока (Рисунок В.29). После нажатия на кнопку "Виставити відмітку", в левой части экрана появляется панель (Рисунок В.30) для оценивания/редактирования выставленной оценки студенту либо его посещаемости.

13. Страница добавления и редактирования теста

Рисунок В.31 Страница для добавления и/или редактирования теста

При переходе на страницу "Добавити/редагувати тест" (Рисунок В.31) мы видим с правой стороны панель для добавления/редактирования теста, посередине сверху фильтр, и посредине таблицу с тестами. При создании теста, необходимо указать тип теста: "З однією вірною відповідю" "З кількома вірними відповідями", либо "Заповнити вільні місця". После чего данная панель приобретает соответствующие поля для ввода. Рассмотрим панель, которая выбрана по умолчанию - "З однією вірною відповідю". Следующая информация, которую нам необходимо заполнить - это создать для данного теста уникальное имя, по которому впоследствии будет быстро его найти. После этого заполнить сам вопрос и возможные варианты ответа на него. После этого выбрать напротив тот вариант, который является верным и сохранить его. Если данные были внесены верно, то после сохранения этот тест появится в таблице.

14. Страница литературы

Рисунок В.32 Литература

При переходе на страницу "Література" (Рисунок В.32) мы видим схожий дизайн страницы с "Добавити/редагувати тест". Отличия лишь заключаются в названии полей.

15. Страница нехватки прав пользователя

Рисунок В.33 Страница, которая показывается пользователю в случае нехватки прав доступа к ресурсу.

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

ПРИЛОЖЕНИЕ Г

КОД ПРОГРАММЫ

Код реализации каркаса:

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package utils;

import com.sun.data.provider.RowKey;

import com.sun.rave.web.ui.appbase.FacesBean;

import com.sun.webui.jsf.component.Button;

import com.sun.webui.jsf.component.DropDown;

import com.sun.webui.jsf.component.Field;

import com.sun.webui.jsf.component.TableRowGroup;

import generic.StringVariables;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.util.ArrayList;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collection;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import java.util.logging.Level;

import java.util.logging.Logger;

import services.EntityService;

import universityportalwar.SessionBean1;

/**

*

* @author Bogdan_Nechyporenko

*/

public class TableUtil {

private static final String methodNameChoosedItemId = "getChoosedItemId";

private static final String methodNamePopulateFields = "populateFields";

private static final String methodNameChangeWasError = "changeWasError";

private static final String methodNameError = "error";

private static final ObjectUtil objectUtil = new ObjectUtil();

public static boolean isAdd() {

boolean result = false;

String addAction = StringVariables.add;

String prevAction = SessionBean1.getPreviousAction();

try {

result = prevAction.startsWith(addAction);

} catch (NullPointerException ex) {

Logger.getLogger(TableUtil.class.getName()).

log(Level.SEVERE, null, ex);

}

return result;

}

public static boolean isEdit() {

boolean result = false;

String editAction = StringVariables.edit;

result = SessionBean1.getPreviousAction().startsWith(editAction);

return result;

}

public static boolean isOpenForAdd() {

return SessionBean1.getPreviousAction().startsWith(StringVariables.openFormForAdd);

}

public static boolean isOpenForEdit() {

return SessionBean1.getPreviousAction().startsWith(StringVariables.openFormForEdit);

}

public Long getChoosedIdOnSpecificJSFPage(TableRowGroup trg,

String classSimpleName) {

RowKey[] choosedUsers = trg.getSelectedRowKeys();

if (choosedUsers.length != 0) {

Long rowId =

Long.parseLong((choosedUsers[0]).getRowId());

if (rowId != null) {

try {

Object obj =

objectUtil.getObjectByIndex(classSimpleName,

rowId.intValue());

Method method = obj.getClass().getDeclaredMethod("getId",

new Class[]{});

return (Long) method.invoke(obj, new Object[]{});

} catch (Exception ex) {

Logger.getLogger(TableUtil.class.getName()).

log(Level.SEVERE, null, ex);

}

}

}

return null;

}

public static void setTextForAddEditButton(Button button, String addText,

String editText) {

if (isOpenForAdd()) {

button.setText(addText);

} else if (isOpenForEdit()) {

button.setText(editText);

} else {

button.setText(null);

}

}

public static boolean conditionForRetrieveAddEditAdditionalForm(boolean wasError) {

return ((isOpenForAdd() || isOpenForEdit()) &&

!wasError);

}

public static void prerenderTemplate(Object thisObject, Boolean wasError) {

try {

Class clazz = thisObject.getClass();

String methodNameForVisibility =

"setForSomeComponentsOnFormVisibility";

String methodNameForButton = "setTextForAddEditButton";

Method methodForVisibility = clazz.getDeclaredMethod(methodNameForVisibility,

new Class[]{Boolean.TYPE});

Method methodForButton =

clazz.getDeclaredMethod(methodNameForButton, new Class[]{});

methodForVisibility.setAccessible(true);

methodForButton.setAccessible(true);

methodForVisibility.invoke(thisObject, false);

if (conditionForRetrieveAddEditAdditionalForm(wasError)) {

methodForVisibility.invoke(thisObject, true);

methodForButton.invoke(thisObject, new Object[]{});

}

} catch (Exception ex) {

Logger.getLogger(TableUtil.class.getName()).log(Level.SEVERE, null, ex);

}

}

public static String addEditFunctionality(Object thisObject,

Class entityClass, String previousActionName, String[] componentNamesArr, Class[] parameterTypesArr) {

SessionBean1.setPreviousAction(previousActionName);

Object entityObject = getEntityAndSetFieldsWithValues(thisObject,

entityClass, componentNamesArr, parameterTypesArr);

persistOrMergeEnity(entityObject);

return null;

}

public static void persistOrMergeEnity(Object entityObject) {

if (entityObject != null) {

if (TableUtil.isAdd()) {

(new EntityService()).persistEntity(entityObject);

} else if (TableUtil.isEdit()) {

(new EntityService()).mergeEntity(entityObject);

}

}

}

public static Object getEntityAndSetFieldsWithValues(Object thisObject,

Class entityClass, String[] componentNamesArr,

Class[] parameterTypesArr) {

try {

Collection<String> componentNames = Arrays.asList(componentNamesArr);

Map<String, Method> declaredMethods = getDeclaredMethods(thisObject); setAccessibilityForMethods(declaredMethods.values().toArray(new Method[]{}),true);

Object entityObject = getEntity(thisObject, entityClass); if (entityObject != null) {

Object[] inputFields = getValuesOfComponents(thisObject,

componentNames);

if (!conditionForNullOrEmptyOneOfElementInArray(inputFields)) {

Map<String, Map<Class, Object>> setterNamesAndValues = getSetterNamesAndValues(thisObject, componentNames, Arrays.asList(parameterTypesArr));

invokeEntitySetterMethods(entityObject,

setterNamesAndValues);

return entityObject;

} else {

ifWasntChooseIdAndPressEditOrRemove(thisObject);

}

}

} catch (Exception ex) { Logger.getLogger(TableUtil.class.getName()).log(Level.SEVERE, null,

ex);

}

return null;

}

public static Object getEntity(Object thisObject, Class entityClass)

throws Exception {

if (TableUtil.isAdd()) {

return ReflectionUtil.createEntity(entityClass);

} else if (TableUtil.isEdit()) {

return getEntityByChoosedTableRowId(thisObject, entityClass,

methodNameChoosedItemId);

}

return null;

}

private static Object getEntityByChoosedTableRowId(Object thisObject,

Class entityClass, String methodName) throws Exception {

Long itemId =

(Long) getDeclaredMethods(thisObject).get(methodName).

invoke(thisObject, new Object[]{});

if (itemId != null) {

return (new EntityService()).getEntityById(entityClass,

itemId);

}

return null;

}

private static Long getEntityIdOfChoosingTableRow(Object thisObject)

throws Exception {

return (Long) getDeclaredMethods(thisObject).get(methodNameChoosedItemId).

invoke(thisObject, new Object[]{});

}

public static String fillAdditionalEditForm(Object thisObject,

Class entityClass, String[] componentNames,

String previousActionName) {

SessionBean1.setPreviousAction(previousActionName);

try {

List<String> temp = new ArrayList<String>();

for (String compomentName : componentNames) {

temp.add("get" + makeFirstLetterInUpperCase(compomentName));

}

String[] getterNames = temp.toArray(new String[]{});

Map<String, Method> declaredMethods = getDeclaredMethods(thisObject);

Method[] methods =

(declaredMethods.values()).toArray(new Method[]{});

setAccessibilityForMethods(methods, true);

Long itemId = (Long) declaredMethods.get(methodNameChoosedItemId).invoke(thisObject,

new Object[]{});

if (itemId != null) {

Object entityObject = (new EntityService()).getEntityById(entityClass, itemId);

if (entityObject != null) {

Object[] functionParameters = {getValuesFromEntityGetterMethods(entityObject, getterNames) };

declaredMethods.get(methodNamePopulateFields).invoke(thisObject,

functionParameters);

}

} else {

ifWasntChooseIdAndPressEditOrRemove(thisObject);

return "";

}

return StringVariables.editSpeciality;

} catch (Exception ex) { Logger.getLogger(TableUtil.class.getName()).log(Level.SEVERE, null,

ex);

}

return null;

}

public static Map<String, Method> getDeclaredMethods(Object thisObject)

throws NoSuchMethodException {

Map<String, Method> methodsMap = new HashMap<String, Method>();

Class clazz = thisObject.getClass();

Method methodChoosedItemId =

clazz.getDeclaredMethod(TableUtil.methodNameChoosedItemId,

new Class[]{});

Method methodPopulateFields = clazz.getDeclaredMethod(TableUtil.methodNamePopulateFields,

String[].class);

Method methodChangeWasError =

clazz.getDeclaredMethod(TableUtil.methodNameChangeWasError,

new Class[]{Boolean.TYPE});

Method methodError =

FacesBean.class.getDeclaredMethod(TableUtil.methodNameError,

new Class[]{String.class});

methodsMap.put(methodNameChoosedItemId, methodChoosedItemId);

methodsMap.put(methodNamePopulateFields, methodPopulateFields);

methodsMap.put(methodNameChangeWasError, methodChangeWasError);

methodsMap.put(methodNameError, methodError);

return methodsMap;

}

public static Map<String, Map<Class, Object>> getSetterNamesAndValues(Object thisObject,

Collection<String> componentNames,

Collection<Class> typesOfInputValues) {

List<Object> resultObjectValueList = null;

try {

resultObjectValueList = Arrays.asList(getValuesOfComponents(thisObject, componentNames));

Map<String, Map<Class, Object>> resultMap =

new HashMap<String, Map<Class, Object>>();

Iterator componentNamesIterator = componentNames.iterator();

Iterator objectValuesOfComponentsIterator =

resultObjectValueList.iterator();

Iterator typesOfInputValuesIterator = typesOfInputValues.iterator();

while (componentNamesIterator.hasNext()) {

Map<Class, Object> composeMap = new HashMap<Class, Object>();

String componentName = componentNamesIterator.next().toString();

Object objectValueOfComponent =

objectValuesOfComponentsIterator.next();

Class typeClass = (Class) typesOfInputValuesIterator.next();

composeMap.put(typeClass, objectValueOfComponent);

resultMap.put("set" + makeFirstLetterInUpperCase(componentName),

composeMap);

}

return resultMap;

} catch (Exception ex) {

Logger.getLogger(TableUtil.class.getName()).

log(Level.SEVERE, null, ex);

}

return null;

}

public static Object[] getValuesOfComponents(Object thisObject,

Collection<String> componentNames) {

Object[] resultArray = null;

List<Object> componentValuesList = new ArrayList<Object>();

try {

for (String componentName : componentNames) {

Object componentObject =

getComponentObjectByHisName(thisObject, componentName);

Method getValueMethod = null;

if (componentObject instanceof Field) {

getValueMethod =

Field.class.getDeclaredMethod("getValue", new Class[]{});

} else if (componentObject instanceof DropDown) {

getValueMethod =

DropDown.class.getDeclaredMethod("getValue", new Class[]{});

}

if (getValueMethod != null) {

componentValuesList.add(getValueMethod.invoke(componentObject,

new Object[]{}));

}

}

} catch (Exception ex) {

Logger.getLogger(TableUtil.class.getName()).

log(Level.SEVERE, null, ex);

}

resultArray = componentValuesList.toArray();

return resultArray;

}

private static Object getComponentObjectByHisName(Object thisObject,

String componentName) throws Exception {

Method objectsGetter = thisObject.getClass().getDeclaredMethod("get" +

makeFirstLetterInUpperCase(componentName) + "Field",

new Class[]{});

return objectsGetter.invoke(thisObject, new Object[]{});

}

private static String makeFirstLetterInUpperCase(String word) {

return (new StringBuilder(word)).replace(0, 1, word.substring(0, 1).

toUpperCase()).toString();

}

private static void invokeEntitySetterMethods(Object entity,

Map<String, Map<Class, Object>> setterNamesAndValues)

throws NoSuchMethodException, IllegalAccessException,

IllegalArgumentException, InvocationTargetException {

for (Map.Entry<String, Map<Class, Object>> entry : setterNamesAndValues.entrySet()) {

String methodName = entry.getKey();

for (Map.Entry<Class, Object> parameterAndValue : entry.getValue().entrySet()) {

Class classType = parameterAndValue.getKey();

Method tempMethod = entity.getClass().getDeclaredMethod(methodName,

new Class[]{classType});

tempMethod.setAccessible(true);

if (classType == Integer.class) {

tempMethod.invoke(entity, Integer.valueOf(parameterAndValue.getValue().toString()));

} else if (classType == String.class) {

tempMethod.invoke(entity, parameterAndValue.getValue().toString());

}

}

}

}

private static void setAccessibilityForMethods(Method[] methods,

boolean isAccessible) {

for (Method method : methods) {

method.setAccessible(isAccessible);

}

}

private static String[] getValuesFromEntityGetterMethods(Object entity, String[] getterNames)

throws NoSuchMethodException, IllegalAccessException,

IllegalArgumentException, InvocationTargetException {

Integer length = getterNames.length;

String[] result = new String[length];

for (int index = 0; index < length; index++) {

Method tempMethod = entity.getClass().getDeclaredMethod(getterNames[index],

new Class[]{});

tempMethod.setAccessible(true);

result[index] = tempMethod.invoke(entity, new Object[]{}).toString();

}

return result;

}

private static boolean conditionForNullOrEmptyOneOfElementInArray(Object... objects) {

for (Object obj : objects) {

if (obj == null || "".equals(obj.toString())) {

return true;

}

}

return false;

}

public static String getNameOfPreviousActionWithinAddEdit() {

String previousAction = SessionBean1.getPreviousAction();

if (previousAction.startsWith(StringVariables.openFormForAdd)) {

return StringVariables.add;

} else if (previousAction.startsWith(StringVariables.openFormForEdit)) {

return StringVariables.edit;

}

return null;

}

public static boolean removeImplementation(Object thisObject,

Object entity) {

try {

Long entityId = getEntityIdOfChoosingTableRow(thisObject);

if (entityId != null) {

(new EntityService()).removeEntity(entity, entityId);

return true;

} else {

ifWasntChooseIdAndPressEditOrRemove(thisObject);

}

} catch (Exception ex) {

Logger.getLogger(TableUtil.class.getName()).log(Level.SEVERE, null,

ex);

}

return false;

}

public static void ifWasntChooseIdAndPressEditOrRemove(Object thisObject) {

try {

getDeclaredMethods(thisObject).get(methodNameError).

invoke(thisObject,

StringVariables.ifItemWasntChoosed);

getDeclaredMethods(thisObject).get(methodNameChangeWasError).

invoke(thisObject, true);

} catch (Exception ex) {

Logger.getLogger(TableUtil.class.getName()).log(Level.SEVERE, null,

ex);

}

}

}

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.