Файл: Анализ тз 2 Рассмотрение тз. 2 Глава проектирование веб приложения 6 Диаграммы вариантов использования. 6.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.05.2024

Просмотров: 43

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Оглавление

ГЛАВА 1. Анализ ТЗ

1.1. Рассмотрение ТЗ.

ГЛАВА 2. Проектирование веб приложения

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

2.2. Физическая модель базы данных

2.3. Выбор средств разработки

ГЛАВА 3. Реализация веб приложения

3.1. Реализация GUI пользователя

3.2. Реализация GUI преподавателя На главной странице есть кнопка входа, если внести данные для определенного преподавателя, то откроется личный кабинет.Система авторизации описана ниже.include($_SERVER['DOCUMENT_ROOT']."/script-php/link-connect.php");//Функиция Авторизации$inp_log_auth = $_POST['inp_log_auth'];//Проверка Данных пользователя{$sql_auth_proverka = "SELECT * FROM `users` WHERE `login` = '$inp_log_auth'";$result_auth = mysqli_query($conn, $sql_auth_proverka);$result_auth_array = mysqli_fetch_array($result_auth);//проверка Логинаif(isset($result_auth)) {//Проверка Пароля$inp_pass_auth = $_POST['inp_pass_auth'];$pass_hash = $result_auth_array['pass'];if (password_verify($inp_log_auth, $pass_hash)) {//Запись в сессию уникального id session_start();$_SESSION['action'] = $result_auth_array['id_users'];echo "good";}else echo "Неверный Пароль!".$pass_hash;}else {echo "Неверный Логин!";}}На главной странице преподавателя есть три кнопки меню: редактировать тест, создать новый, а также посмотреть статистику. Рисунок 3.3. Главная страница преподавателя.Страница редактирования теста показана на рис (3.4). Рисунок 3.4. Редактирование теста.Запись теста в базу данных. Формирование его в массив для отправки показан в листинге 2.Работа на стороне браузера(js), описана в листинге 3. 3.3. Реализация GUI Администратора Администратор может управлять предметами и преподавателями, а такИзменять главную информацию на сайте с помощью редактора текста на js. Рисунок 3.4. Панель редактирования.Так же есть возможность менять главную картинку на сайте с помощью данного кода:include($_SERVER['DOCUMENT_ROOT']."/script-php/link-connect.php");// Название $input_name = 'file';// Разрешенные расширения файлов.$allow = array();// Запрещенные расширения файлов.$deny = array('phtml', 'php', 'php3', 'php4', 'php5', 'php6', 'php7', 'phps', 'cgi', 'pl', 'asp','aspx', 'shtml', 'shtm', 'htaccess', 'htpasswd', 'ini', 'log', 'sh', 'js', 'html','htm', 'css', 'sql', 'spl', 'scgi', 'fcgi', 'exe');// Директория куда будут загружаться файлы.//$path = $_SERVER['DOCUMENT_ROOT']."/";$path = $_SERVER['DOCUMENT_ROOT']."/src/";$error = $success = '';if (!isset($_FILES[$input_name])) {$error = 'Файл не загружен.';} else {$file = $_FILES[$input_name];// Проверим на ошибки загрузки.if (!empty($file['error']) || empty($file['tmp_name'])) {$error = 'Не удалось загрузить файл.';} elseif ($file['tmp_name'] == 'none' || !is_uploaded_file($file['tmp_name'])) {$error = 'Не удалось загрузить файл.';} else {// Оставляем в имени файла только буквы, цифры и некоторые символы.$pattern = "[^a-zа-яё0-9,

Вывод

Приложение

Листинг 1(test.js)

Листинг 2(prepodFunction.php)

Листинг 3(prepod.js)

Листинг 4(function.php), для администратора

Листинг 5(admin.js) //Генератор пароля{$("#input-generate").click(function(){var $input = $("#input-password");$input.val('');var pass = generatePassword();var txt = pass.split("");var interval = setInterval(function(){if(!txt[0]){clearInterval(interval);} else {$input.val($input.val() + txt.shift());}}, 50);return false;});function generatePassword(){var length = 8,charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz




$conn = mysqli_connect("localhost", "admin", "admin", "site_kafedra");

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


3.2. Реализация GUI преподавателя


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

Система авторизации описана ниже.

include($_SERVER['DOCUMENT_ROOT']."/script-php/link-connect.php");

//Функиция Авторизации
$inp_log_auth = $_POST['inp_log_auth'];

//Проверка Данных пользователя
{
$sql_auth_proverka = "SELECT * FROM `users` WHERE `login` = '$inp_log_auth'";
$result_auth = mysqli_query($conn, $sql_auth_proverka);
$result_auth_array = mysqli_fetch_array($result_auth);

//проверка Логина
if(isset($result_auth)) {

//Проверка Пароля
$inp_pass_auth = $_POST['inp_pass_auth'];
$pass_hash = $result_auth_array['pass'];
if
(password_verify($inp_log_auth, $pass_hash)) {

//Запись в сессию уникального id
session_start();
$_SESSION['action'] = $result_auth_array['id_users'];

echo
"good";
}
else echo "Неверный Пароль!".$pass_hash;
}
else {
echo "Неверный Логин!";
}
}


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



Рисунок 3.3. Главная страница преподавателя.

Страница редактирования теста показана на рис (3.4).



Рисунок 3.4. Редактирование теста.

Запись теста в базу данных. Формирование его в массив для отправки показан в листинге 2.

Работа на стороне браузера(js), описана в листинге 3.

3.3. Реализация GUI Администратора



Администратор может управлять предметами и преподавателями, а так

Изменять главную информацию на сайте с помощью редактора текста на js.



Рисунок 3.4. Панель редактирования.

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


include
($_SERVER['DOCUMENT_ROOT']."/script-php/link-connect.php");

// Название
$input_name = 'file';

// Разрешенные расширения файлов.
$allow = array();

// Запрещенные расширения файлов.
$deny = array(
'phtml', 'php', 'php3', 'php4', 'php5', 'php6', 'php7', 'phps', 'cgi', 'pl', 'asp',
'aspx', 'shtml', 'shtm', 'htaccess', 'htpasswd', 'ini', 'log', 'sh', 'js', 'html',
'htm', 'css', 'sql', 'spl', 'scgi', 'fcgi', 'exe'
);

// Директория куда будут загружаться файлы.
//$path = $_SERVER['DOCUMENT_ROOT']."/";
$path = $_SERVER['DOCUMENT_ROOT']."/src/";


$error = $success = '';

if
(!isset($_FILES[$input_name])) {
$error = 'Файл не загружен.';
}
else {
$file = $_FILES[$input_name];

// Проверим на ошибки загрузки.
if (!empty($file['error']) || empty($file['tmp_name'])) {
$error = 'Не удалось загрузить файл.';
}
elseif ($file['tmp_name'] == 'none' || !is_uploaded_file($file['tmp_name'])) {
$error = 'Не удалось загрузить файл.';
}
else {
// Оставляем в имени файла только буквы, цифры и некоторые символы.
$pattern = "[^a-zа-яё0-9, !@#%^-_

\$\?\(\)\{\}\[\]\.]";
$name = mb_eregi_replace($pattern, '-', $file['name']);
$name = mb_ereg_replace('[-]+', '-', $name);
$parts = pathinfo($name);

if
(empty($name) || empty($parts['extension'])) {
$error = 'Недопустимый тип файла';
}
elseif (!empty($allow) && !in_array(strtolower($parts['extension']), $allow)) {
$error = 'Недопустимый тип файла';
}
elseif (!empty($deny) && in_array(strtolower($parts['extension']), $deny)) {
$error = 'Недопустимый тип файла';
}
else {
// Перемещаем файл в директорию.
if (move_uploaded_file($file['tmp_name'], $path . $name)) {
// Далее можно сохранить название файла в БД и т.п.
mysqli_query($conn, "UPDATE `content` SET `img_content`= '$name' WHERE `id`='1'");
$success = '
Файл «' . $name . '» успешно загружен.
'
;
}
else {
$error = '3Не удалось загрузить файл.';
}
}
}
}

// Вывод сообщения о результате загрузки.
if (!empty($error)) {
$error = '
'
. $error . '
'
;
}

$data = array(
'error' => $error,
'success' => $success,
'img_name' =>$name,
);

header('Content-Type: application/json');
echo
json_encode($data, JSON_UNESCAPED_UNICODE);
exit
();

?>


Основной функционал администратора расписан в листингах 4-5.

Вывод


В рамках данного обучающего проекта было выполнены задачи такие как:

Для пользователя возможность смотреть информацию на главной странице, проходить тест.

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

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

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

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

Задача помогла развить навыки работы с языка в паре как js, так и php, за действуя каждый в нужном месте, реализовано с работой на ООП, для более удобного написания кода и возможностей развития проекта в дальнейшем.

Доступы к кабинетам для администратора: admin , admin

Доступы к кабинетам для преподавателя: prepod, prepod

База данных сохранена в кодировке utf-8 general ci

Приложение

Листинг 1(test.js)


//функция записи Теста в массив
function getTest(){
//скрытый инпут ссылка на тест
var link = $('#link_test').val();
let result = [];
$.ajax({
url: '../role/prepod/script-php/function.php',
method: 'post',
dataType : "json",
async:false,
data: {action:'arrayTest', link:link},
success: function(data){
result = data;
}
});
return result;
};

//запись в переменную массива с тестом
var data = getTest();

//кнопка начать тест
$('body').on('click',"#startTest", function() {
var input1 = $('#input1').val();
var input2 = $('#input2').val();
var input3 = $('#input3').val();
var input4 = $('#input4').val();
var input5 = $('#input5').val();

var input6 = $('#input6').val();

//проверка всех полей
//if((input1.length >= 4) && (input2.length>= 4) && (input3.length>= 4) && (input4.length>= 4) && (input5.length>= 4) && (input6.length>= 1)) {
//if((input1 != 0) && (input2 != 0) && (input3 != 0) && (input4 != 0) && (input5 != 0) && (input6 != 0)) {
alert("Начинаем Тест");
var count = $('#num_voprosov').val();

//цикл записи вопросов
for (let value=1; value<=count; value++){
var result = parseFloat(value)-1;

//если строка
if(data[1][result]['type'] == "stroka") {
$('.testAction').append(
'
+value+'" >'+
'
'+
'Вопрос №'+value+''+
''+data[1][result]['name_question']+''+
''+
'
'+

'
'+
''+
'
'+
'
'
);
}
//если тест
if(data[1][result]['type'] == "test") {
$('.testAction').append(
'
+value+'" >'+
'
'+
'Вопрос №'+value+''+
''+data[1][result]['name_question']+''+
''+
'
'+

'
'+
'
'+
''+
''+
'
'+

'
'+
''+
''+
'
'+

'
'+
''+
''+
'
'+

'
'+
''+
''+
'
'+
'
'+
'
'
);
}
}
//запускаем таймер
$('#countdown-1').timeTo(1200, function () {
resultTest();
});
//открываем кнопки
var startTest = document.getElementById("startTest");
startTest.style.display = 'none';
var finishTest = document.getElementById("finishTest");
finishTest.style.display = 'block';
//открываем первый блок с вопросами
var id_van_block = document.getElementById("1");
id_van_block.style.display = 'block';
//}
//else alert("Проверьте введенные Данные!");
//}
//else alert("Проверьте введенные Данные!");

});


//кнопка подвердить вопрос
$('body').on('click',".but_good_vopros", function() {

function proverka(){
//открываем сдедующий вопрос
var count = $('#num_voprosov').val();
var chet;
for(let i=1;i<=count;i++){
var clickBut = document.getElementById('click_but_'+i);
if(clickBut.dataset.active == "true"){
var id_van_block = document.getElementById(i);
id_van_block.style.display = 'block';
chet = 1;
}
}
if(!chet){
$('#countdown-1').timeTo(1, function () {});
resultTest();
}
return;
}

var data_type = $(this).attr('data-type');
var data_id_vopros = $(this).attr('data-id-vopros');
//переменная для массива по счету вопроса
var amout = data_id_vopros-1;


//проверка внесен ли ответ
if(data_type == "stroka") {
var value_input_otvet = $("#input_otvet_"+data_id_vopros).val();
if((value_input_otvet.length == 0)) {
alert("Запишите ответ!");