id
|
login
|
password
|
name
|
job
|
Id
администратора
|
логин
|
пароль
|
имя
|
В
качестве кого работает
|
Содержит информацию об администраторе.
Листинги создания таблиц представлены в
Приложении (Листинг 1).
На уровне баз данных находится разработанная для
данной информационной системы база test, хранящая в себе данные о проектах.
Реализована эта база данных на СУРБД MySQL.
Первым этапом в разработке системы стало
выделение основных сущностей, которые представлены в ER-диаграмме (См.
рис.3.1).
Рисунок 3.1. ER-диаграмма
4. Функциональная спецификация
Обучающий курс.
Для начала пользователь видит простой слайдер с
навигационными кнопками, но при нажатии на изображение пользователь переходит в
окно с подробным описанием проблемы и его решением. На первом этапе все данные
хранятся отдельно, но в последующей доработке перенесутся в базу. Курс будет
дополняться за счет внесенных данных пользователей, которые столкнулись с
какой-либо проблемой и просят администраторов помочь или просто хотят
поделиться решением проблемы(См. рис. 4.1).
Рисунок 4.1. Слайдер.
Ввод информации о проектах
Добавление информации происходит с помощью
стандартной формы (рисунок 4.2). Проекты заносятся в базу projects при обратке
скрипта. После занесения данных в базу обрабатывается форма занесения данных и
преобразовывается дата для базы данных и данные перепроверяются. Алгоритм для
ввода информации о багах однотипен только сдобавлением других полей (рисунок
4.3).
Рисунок 4.2. Добавление информации о проектах
Рисунок 4.3. Добавление информации о багах
Вывод информации о правках администратора
Для вывода данных о правках из базы требуется
знать id администратора (рисунок 4.4). Далее поступает запрос в базу и в виде
таблицы генерируется ответ. Ответ генерируется соединением двух таблиц при
помощи join. Выводит поэтапно в зависимости от времени добавления. Аналогично
работает алгоритм по выводу сведений о проекте(рисунок 4.5).
Рисунок 4.4. Вывод информации о правках
администратора
Рисунок 4.5. Вывод информации о проекте.
Тестирование обучающего курса.
Теоретические сведения
Существующие на сегодняшний день методы
тестирования ПО не позволяют однозначно и полностью выявить все дефекты и
установить корректность функционирования анализируемой программы, поэтому все
существующие методы тестирования действуют в рамках формального процесса
проверки исследуемого или разрабатываемого ПО.
Такой процесс формальной проверки, или
верификации, может доказать, что дефекты отсутствуют с точки зрения
используемого метода. (То есть нет никакой возможности точно установить или
гарантировать отсутствие дефектов в программном продукте с учётом человеческого
фактора, присутствующего на всех этапах жизненного цикла ПО).
Существует множество подходов к решению задачи
тестирования и верификации ПО, но эффективное тестирование сложных программных
продуктов - это процесс в высшей степени творческий, не сводящийся к следованию
строгим и чётким процедурам или созданию таковых.
Юзабилити-тестирование (проверка эргономичности)
- исследование, выполняемое с целью определения, удобен ли некоторый
искусственный объект (такой как веб-страница, пользовательский интерфейс или
устройство) для его предполагаемого применения. Таким образом, проверка
эргономичности измеряет эргономичность объекта или системы. Проверка
эргономичности сосредоточена на определённом объекте или небольшом наборе объектов,
в то время как исследования взаимодействия человек-компьютер в целом -
формулируют универсальные принципы.
При испытании многих продуктов пользователю
предлагают в «лабораторных» условиях решить основные задачи, для выполнения
которых этот продукт разрабатывался, и просят высказывать во время выполнения
этих тестов свои замечания.
Процесс тестирования фиксируется в протоколе
(логе) и/или на аудио- и видеоустройства - с целью последующего более
детального анализа.
Если проверка эргономичности выявляет какие-либо
трудности (например, сложности в понимании инструкций, выполнении действий или
интерпретации ответов системы), то разработчики должны доработать продукт и
повторить тестирование.
Основную трудность после проведения процедуры
проверки эргономичности нередко представляют большие объёмы и беспорядочность
полученных данных. Поэтому для последующего анализа важно зафиксировать:
Речь модератора и респондента;
Выражение лица респондента (снимается на
видеокамеру);
Изображение экрана компьютера, с которым
работает респондент;
Различные события, происходящие на компьютере,
связанные с действиями пользователя:
Перемещение курсора и нажатия на клавиши мыши;
Использование клавиатуры;
Переходы между экранами (браузера или другой
программы).
Все эти потоки данных должны быть
синхронизированы по тайм-кодам, чтобы при анализе их можно было бы соотносить
между собой.
Наряду с модератором в тестировании нередко
участвуют наблюдатели. По мере обнаружения проблем они делают свои заметки о
ходе тестирования так, чтобы после можно было синхронизировать их с основной
записью. В итоге каждый значимый фрагмент записи теста оказывается
прокомментирован в заметках наблюдателя. В идеале ведущий (т.е. модератор)
представляет разработчика, наблюдатели - заказчика (например издателя,
дистрибьютора), а испытатели - конечного пользователя (например покупателя).
Тестирование ИС
Для начала протестируем ИС для добавления
информации о проектах. Для данного тестирование был выбран метод
«юзабилити-тестирование». Необходиом проверить удобен ли наш курс для
пользователей.
Первоначально предложим им посмотреть наш
слайдер(См. рис. 5.1).
Основные минусы в том, что разные форматы
картинок и изображение из-за это теряет качество и постоянно «прыгает».
Рисунок 5.1. Слайдер.
Далее посмотрим страницу с вводом данных
(рисунок 5.2).
Рисунок 5.2. Ввод данных.
Для начала заполним поля информацией (рисунок
4.2).
Рисунок 5.3. Заполнение формы
При добавлении данных возникли проблемы.
Возникли из-за формата даты, так как в данной ИС ее можно добавлять только в
формате дд.мм.гггг(дд.мм.гг).
Рисунок 5.4. неправильный ввод даты проекта
Кроссбраузерная верстка так же была проверена,
но так таковых явных багов не найдено. В дальнейшем все баги в системе будут
устранены для последующего развития и расширения данной информационной системы.
Заключение
интерфейс сайт листинг
В настоящей курсовой работе было рассмотрено,
как лучше всего организовать обучающий сайт и что в него должно входить.
Далее была предоставлена функциональная
спецификация, описывающая то, какие процессы происходят в системе, как
взаимодействуют между собой элементы интерфейса, как интерфейс выглядит.
Настоящая разработка может не является конечным
вариантом и может быть легко доработана исходя из нужд заказчика. Однако, в
текущем варианте она уже пригодна к использованию и удовлетворяет требованиям
эргономичности и производительности, принятых на современном рынке
веб-приложений.
Список литературы
) Официальная документация языка PHP:
http://php.net ;
) Гради Буч, Роберт А. Максимчук, «Объектно-ориентированный
анализ и проектирование с примерами приложений», изд. «Вильямс», 2008,
) Веллинг Л., Томсон Л. Разработка
web-приложений с помощью РНР и MySQL. Третье издание - «Вильямс», 2005
) Фаулер М., Скотт К. UML. Основы. - СПб:
Символ- Плюс, 2002
) Марков А.А. Практическое введение в
базы данных. Методическое пособие, часть 1, 2,
) Энди Гутманс, Стик Баккен, Деррик
Ретанс. «PHP Профессиональное пограммирование». - СПб: Символ, 2006
Приложение
Листинг 1. Создание таблиц
-
База данных: `test`
-
-------------------------------------------------------
-
Структура таблицы `admins`
-
CREATE TABLE IF NOT EXISTS `admins`
(
`id` int(20) NOT NULL AUTO_INCREMENT,
`login` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`job` varchar(255) NOT NULL,KEY
(`id`)
) ENGINE=MyISAM DEFAULT
CHARSET=cp1251 AUTO_INCREMENT=3 ;
-
Структура таблицы
`bugs`
-TABLE IF NOT EXISTS `bugs` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`project_id` int(20) NOT NULL,
`pos_bugs` blob NOT NULL,
`func_bugs` blob NOT NULL,
`date` date NOT NULL,
`importance` tinyint(1) DEFAULT NULL,
`admin_id` int(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT
CHARSET=cp1251 AUTO_INCREMENT=3 ;
-
Структура таблицы
`projects`
-TABLE IF NOT EXISTS `projects` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`description` blob NOT NULL,
`date` date NOT NULL,
`activity` tinyint(1) DEFAULT
NULL,KEY (`id`)
) ENGINE=MyISAM DEFAULT
CHARSET=cp1251 AUTO_INCREMENT=3 ;
Листинг 1. Создание таблиц
Листинг 2. Файл testingIS.php
<?php
_default_timezone_set('Europe/Moscow');
session_start();
//var_dump($_SERVER);
//if ( stristr($_SERVER['HTTP_USER_AGENT'],
'Firefox') ) echo stristr($_SERVER['HTTP_USER_AGENT'], 'Firefox');
//echo
"OK!";_connect('localhost','root','root');
mysql_select_db("test");
?>
<html>
<head>
<meta charset="utf-8">
</head>
<link href="css/bootstrap.css"
rel="stylesheet">
<link href="css/bootstrap.min.css"
rel="stylesheet">
<link
href="css/bootstrap-responsive.css" rel="stylesheet">
<body>
<form
action="testingIS.php" method="POST">
<div>
<button>
<button>
<button>
<button>
<button>
</div>
</form>
<div>
<?php
(isset($_POST["learn"])){
?>
<script
type="text/javascript">
$('.carousel').carousel();
</script>
<div>
<div>
<div>
<img alt=""
src="img/1.jpg">
</div>
<div>
<img alt=""
src="img/2.jpg">
</div>
<div>
<img alt=""
src="img/3.jpg">
</div>
<div>
<img alt=""
src="img/4.jpg">
</div>
</div>
<a data-slide="prev"
href="#myCarousel">
<a data-slide="next"
href="#myCarousel">
</div>
<?php
}(isset($_POST["proj"])){
?>
<div>
<h4>Ввод информации о
проектах</h4><br />
<form action="testingIS.php"
method="POST">
<div>
<label>
<div>
<input type="text"
name="name">
</div>
</div>
<div>
<label>
<div>
<textarea
name="description"></textarea>
</div>
</div>
<div>
<label>
<div>
<input type="text"
name="date">
</div>
</div>
<div>
<label>
<div>
<select name="activity">
<option
value="0">0</option>
<option
value="1">1</option>
</select>
</div>
</div>
<input type="submit"
value="Добавить" name="save_proj">
</form>
</div>
<?php
}(isset($_POST['bugs'])){
?>
<div>
<h4>Ввод информации о багах
</h4><br />
<form action="testingIS.php"
method="POST">
<div>
<label>
<div>
<input type="text"
name="proj_id">
</div>
</div>
<div>
<label>
<div>
<textarea
name="pos_bugs"></textarea>
</div>
</div>
<div>
<label>
<div>
<textarea
name="func_bugs"></textarea>
</div>
</div>
<div>
<label>
<div>
<input type="text"
name="date">
</div>
</div>
<div>
<label>
<div>
<select name="importance">
<option value="grey">
<option value="green">
<option value="yellow">
<option value="red">
</select>
</div>
</div>
<div>
<label>
<div>
<input type="text"
name="admin_id">
</div>
</div>
<input type="submit"
value="Добавить" name="save_bugs">
</form>
<?php
}(isset($_POST['admin'])){
?>
<div>
<h4>Вывод информации о правках админа
</h4> <br />
<form method="POST"
action="testingIS.php">
<div>
<label>
<div>
<select name="admin">
<?php
$q="SELECT id FROM admins";
$result=mysql_query($q);($row =
mysql_fetch_assoc($result)){"<option
value=\"".$row['id']."\">".$row['id']."</option>";
}
?>
</select>
</div>
</div>
<input type="submit"
name="admin_work" value="Узнать">
</form>
</div>
<?php
}(isset($_POST['info'])){
?>
<div>
<h4>Сведения о проекте </h4><br
/>
<form method="POST"
action="testingIS.php">
<div>
<label>
<div>
<select name="project">
<?php
$q="SELECT id FROM projects";
$result=mysql_query($q);($row =
mysql_fetch_assoc($result)){"<option value=\"".$row['id']."\">".$row['id']."</option>";
}
?>
</select>
</div>
</div>
<input type="submit"
name="proj_info" value="Узнать">
</form>
</div>
<?php
}
?>
</div>
</body>
</html>
<?php
$projects_fields=array("name",
"description", "date", "activity");
$bugs_fields =
array("project_id","pos_bugs","func_bugs",
"date", "importance", "admin_id");
function
insertIntoDB($table_name,$fields, $values){
for($i=0; $i<count($values);$i++){
$values[$i]=mysql_real_escape_string($values[$i]);
}
$q="INSERT INTO ".$table_name."
(";($i=0; $i<count($fields)-1; $i++){
$q.=$fields[$i].", ";
}
$q.=$fields[count($fields)-1].") VALUES
(";($i=0; $i<count($values)-1; $i++){
$q.="'".$values[$i]."', ";
}
$q.="'".$values[count($values)-1]."')";
//var_dump($q);$q;
}(isset($_POST['save_proj'])){
$data=array($_POST['name'],$_POST['description'],$_POST['date'],$_POST['activity']);
//преобразование даты из d-m-y в mysql YYYY MM
DD
$data[2]=explode(".", $data[2]);
$d=$data[2][0];//сохраняем день
$data[2][0]=$data[2][1]; //меняем день и месяц
$data[2][1]=$d;
$data[2]=implode("/", $data[2]);
//сохраняем в американском формате
$tmp_date = date_create($data[2]); //создаем
дату
$data[2] = date_format($tmp_date,'Y.m.d'); //меняем
формат
//var_dump($data[2]);
//
$query =
insertIntoDB("projects",$projects_fields, $data);
$result = mysql_query($query);(!$result)
{('Неверный запрос: ' . mysql_error());
}
}(isset($_POST['save_bugs'])){
$data=array($_POST['proj_id'],$_POST['pos_bugs'],$_POST['func_bugs'],$_POST['date'],
$_POST['importance'], $_POST['admin_id']);
$data[3]=explode(".", $data[3]);
$d=$data[3][0];//сохраняем день
$data[3][0]=$data[3][1]; //меняем день и месяц
$data[3][1]=$d;
$data[3]=implode("/", $data[3]);
//сохраняем в американском формате
$tmp_date = date_create($data[3]); //создаем
дату
$data[3] = date_format($tmp_date,'Y.m.d');
//меняем формат
$query =
insertIntoDB("bugs",$bugs_fields, $data);
$result = mysql_query($query);(!$result)
{('Неверный запрос: ' . mysql_error());
}
}
//вывод изменений которые внес
администратор(isset($_POST['admin_work'])){
$admin=mysql_real_escape_string($_POST['admin']);
$query = "SELECT projects.name,
bugs.pos_bugs, bugs.func_bugs, bugs.date, bugs.importance FROM `bugs` JOIN
projects ON bugs.project_id=projects.id WHERE
bugs.admin_id='".$admin."' ORDER BY bugs.date";
$result=mysql_query($query);(!$result)
{('Неверный запрос: ' . mysql_error());
}"<table>
$counter=0;($row = mysql_fetch_assoc($result)) {
$counter++;"<tr>";($row as $key
=> $value) {
echo
"<td>".$value."</td>";
}"</tr>";
}"</table>";($counter==0){"Нет
данных";
}{
$counter=0;
}
}(isset($_POST['proj_info'])){
$project=mysql_real_escape_string($_POST['project']);
$query = "SELECT projects.name,
projects.description, projects.date AS pdate, projects.activity, bugs.pos_bugs,
bugs.func_bugs, bugs.date AS bdate, bugs.importance, bugs.admin_id FROM `bugs`
JOIN projects ON bugs.project_id=projects.id WHERE
projects.id='".$project."' AND bugs.importance='1'";
$result=mysql_query($query);(!$result)
{('Неверный запрос: ' . mysql_error());
}"<table>
$counter=0;($row = mysql_fetch_assoc($result)) {
$counter++;"<tr>";($row as $key
=> $value) {(strpos($key, "date")!=false){
$tmp_date = new DateTime($value);
//echo $tmp_date->format('d m
Y');"<td>".$tmp_date->format('d.m.y')."</td>";
}{"<td>".$value."</td>";
}
}"</tr>";
}"</table>";($counter==0){"Нет
данных";
}{
$counter=0;
}
}
//Вывод информации по проектам
$query="SELECT name, description, date,
activity FROM projects"; //запрос
$result=mysql_query($query);//выполняем запрос к
базе(!$result) { //ловим ошибки('Неверный запрос: ' . mysql_error());
}
//вывод таблицей
$counter=0;"<table>
$counter++;"<tr>";($row as $key
=> $value) {($key=="date"){
$tmp_date = new DateTime($value);
//echo $tmp_date->format('d m
Y');"<td>".$tmp_date->format('d.m.y')."</td>";
}{"<td>".$value."</td>";
}
}"</tr>";
}"</table>";($counter==0){"Нет
данных";
}{
$counter=0;
}
?>
<script
src="js/jquery.js"></script>
<script
src="js/bootstrap.min.js"></script>
<script
src="js/bootstrap.js"></script>
<script
src="js/bootstrap-transition.js"></script>
<script
src="js/bootstrap-alert.js"></script>
<script src="js/bootstrap-modal.js"></script>
<script
src="js/bootstrap-dropdown.js"></script>
<script
src="js/bootstrap-scrollspy.js"></script>
<script
src="js/bootstrap-tab.js"></script>
<script
src="js/bootstrap-tooltip.js"></script>
<script
src="js/bootstrap-popover.js"></script>
<script
src="js/bootstrap-button.js"></script>
<script
src="js/bootstrap-collapse.js"></script>
<script
src="js/bootstrap-carousel.js"></script>
<script
src="js/bootstrap-typeahead.js"></script>
Листинг 2. Файл testingIS.php