Добавлен: 31.03.2023
Просмотров: 840
Скачиваний: 13
Чтобы попасть на главную страницу, необходимо будет ввести в адресной строке браузера путь до сайта. Далее используя меню в верхней части сайта при необходимости посетить нужные разделы сайта.
Заключение
В данной курсовой работе реализован процесс создания полноценного сайта для сети парикмахерских «Парикмахерская №1». Он оттестирован и готов к размещению в сети интернет.
В первой части работы был разработан дизайн сайта и рассмотрены требования к веб серверу. Также описан бизнес процесс взаимодействия сотрудников и клиентов.
Во второй части спроектирована серверная часть и описано дерево вызова программных модулей. Представлено древо функций.
Третья часть была посвящена разработке структуры и реализация базы данных с использованием СУДБ MySQL.
Цели, которые были поставлены для решения задачи данной работы, такие как разработка дизайна сайта, создание базы данных, программирование внутренней логики сайта и тестирование работы на локальном сервере выполнены в полном объеме.
Полученный результат, можно практически без изменений начать использовать для конкретной компании. Проект имеет понятную структуру и легко может быть модернизирован.
Список литературы
1. Мейер, Б. Инструменты, алгоритмы и структуры данных / Б. Мейер. - 2-е изд., испр. - М. : Национальный Открытый Университет «ИНТУИТ», 2016.
2. Савельева, Н.В. Язык программирования PHP / Н.В. Савельева. - 2-е изд., испр. - М. : Национальный Открытый Университет «ИНТУИТ», 2016
3. Прохоренок, Н. HTML, JavaScript, PHP и MySQL. Джентльменский набор Web-мастера / Н. Прохоренок. - СПб.: БХВ - Петербург., 2010. - 900 с.
4. Мазуркевич, А. PHP: настольная книга программиста / А. Мазуркевич. - М.: Новое знание, 2003. - 480 с.
5. Богданов, М.Р. Перспективные языки веб-разработки / М.Р. Богданов. - 2-е изд., испр. - М. : Национальный Открытый Университет «ИНТУИТ», 2016
6. http://biblioclub.ru/index.php?page=book&id=428953
7. Никсон, Р. Создаем динамические web-сайты с помощью PHP, MySQL и JavaScript / Р. Никсон. - П.: Питер, 2011. - 496 с.
8. PHP, SQL [Electronic resource] / блог. - Россия, 2010.: http://phpsql.ru/.
9. Томсон, Л. Разработка Web-приложений на РНР и MySQL/ Л. Томсон. - М.: ДиаСофтЮП, 2003. - 672 с.
10. PHPForum [Электронный ресурс] /форум.- Россия, 2003. - Режим доступа: http://phpforum.ru. - Дата доступа: 09.02.2012.
11. Харрис, Э. PHP/MySQL для начинающих / Э. Харрис. - М.: Кудиц - образ, 2005.
12. Парк, Д. PHP и MySQL. Библия программиста / Д. Парк, С. Суэринг. - Диалектика, 2010. - 912 с.
Приложение 1. Код серверной части
$link=mysqli_connect("localhost", "mysql_user", "mysql_password", "testtable");
if(isset($_POST['submit']))
{
$err = [];
if(!preg_match("/^[a-zA-Z0-9]+$/",$_POST['login']))
{
$err[] = "Логин может состоять только из букв английского алфавита и цифр";
}
if(strlen($_POST['login']) < 3 or strlen($_POST['login']) > 30)
{
$err[] = "Логин должен быть не меньше 3-х символов и не больше 30";
}
$query = mysqli_query($link, "SELECT user_id FROM users WHERE user_login='".mysqli_real_escape_string($link, $_POST['login'])."'");
if(mysqli_num_rows($query) > 0)
{
$err[] = "Пользователь с таким логином уже существует в базе данных";
}
if(count($err) == 0)
{
$login = $_POST['login'];
$password = md5(md5(trim($_POST['password'])));
mysqli_query($link,"INSERT INTO users SET user_login='".$login."', user_password='".$password."'");
header("Location: login.php"); exit();
}
else
{
print "<b>При регистрации произошли следующие ошибки:</b><br>";
foreach($err AS $error)
{
print $error."<br>";
}
}
}
?>
<form method="POST">
Логин <input name="login" type="text" required><br>
Пароль <input name="password" type="password" required><br>
<input name="submit" type="submit" value="Зарегистрироваться">
function generateCode($length=6) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";
$code = "";
$clen = strlen($chars) - 1;
while (strlen($code) < $length) {
$code .= $chars[mt_rand(0,$clen)];
}
return $code;
}
$link=mysqli_connect("localhost", "mysql_user", "mysql_password", "testtable");
if(isset($_POST['submit']))
{
$query = mysqli_query($link,"SELECT user_id, user_password FROM users WHERE user_login='".mysqli_real_escape_string($link,$_POST['login'])."' LIMIT 1");
$data = mysqli_fetch_assoc($query);
if($data['user_password'] === md5(md5($_POST['password'])))
{
$hash = md5(generateCode(10));
if(!empty($_POST['not_attach_ip']))
{
$insip = ", user_ip=INET_ATON('".$_SERVER['REMOTE_ADDR']."')";
}
mysqli_query($link, "UPDATE users SET user_hash='".$hash."' ".$insip." WHERE user_id='".$data['user_id']."'");
setcookie("id", $data['user_id'], time()+60*60*24*30, "/");
setcookie("hash", $hash, time()+60*60*24*30, "/", null, null, true); // httponly !!!
header("Location: check.php"); exit();
}
else
{
print "Вы ввели неправильный логин/пароль";
}
}
<form method="POST">
Логин <input name="login" type="text" required><br>
Пароль <input name="password" type="password" required><br>
Не прикреплять к IP(не безопасно) <input type="checkbox" name="not_attach_ip"><br>
<input name="submit" type="submit" value="Войти">
</form>
$link=mysqli_connect("localhost", "mysql_user", "mysql_password", "testtable");
if (isset($_COOKIE['id']) and isset($_COOKIE['hash']))
{
$query = mysqli_query($link, "SELECT *,INET_NTOA(user_ip) AS user_ip FROM users WHERE user_id = '".intval($_COOKIE['id'])."' LIMIT 1");
$userdata = mysqli_fetch_assoc($query);
if(($userdata['user_hash'] !== $_COOKIE['hash']) or ($userdata['user_id'] !== $_COOKIE['id'])
or (($userdata['user_ip'] !== $_SERVER['REMOTE_ADDR']) and ($userdata['user_ip'] !== "0")))
{
setcookie("id", "", time() - 3600*24*30*12, "/");
setcookie("hash", "", time() - 3600*24*30*12, "/", null, null, true); // httponly !!!
print "Хм, что-то не получилось";
}
else
{
print "Привет, ".$userdata['user_login'].". Всё работает!";
}
}
else
{
print "Включите куки";
}
setcookie("id", "", time() - 3600*24*30*12, "/");
setcookie("hash", "", time() - 3600*24*30*12, "/",null,null,true); // httponly !!!
header("Location: /"); exit;
<form method="POST">
Логин <input name="login" type="text" required><br>
Пароль <input name="password" type="password" required><br>
Не прикреплять к IP(не безопасно) <input type="checkbox" name="not_attach_ip"><br>
<input name="submit" type="submit" value="Войти">
</form>
Приложение 2.Код алгоритма работы сайта в виде UML последовательности
@startuml
actor Администратор
actor Пользователь
collections Сайт
database База_данных
== Главная ==
Пользователь->Сайт: Делает запрос \nглавной страницы
Сайт->Пользователь: Главная страница
== Авторизация ==
Пользователь->Сайт: Делает запрос \nрегистрация или авторизация
Сайт->База_данных: Запись в таблицу Пользователи \nили запрос есть ли такой
База_данных->Сайт: Авторизован/Зарегистрирован\n/Ошибка/Есть такой
Сайт->Пользователь: Сообщение об успехе/не удаче
== Мастера ==
Пользователь->Сайт: Делает запрос \nдоступные мастера
Сайт->Сайт: Пользователь авторизован? \nесли нет, то идет на страницу \nавторизации/регистрации
Сайт->База_данных: Запрос в таблицу Мастера
База_данных->Сайт: Список
Сайт->Пользователь: Выдача списка \nдоступных мастеров
... Запись ...
Пользователь->Сайт: Желает записаться \nна услуги к мастеру
Сайт->База_данных: Запись в таблицу график Мастера
База_данных->Сайт: Результат дейстия
Сайт->Пользователь: Сообщение об успехе/не удаче
== Отзывы ==
Пользователь->Сайт: Делает запрос \nдоступные мастера
Сайт->Сайт: Пользователь авторизован? \nесли нет, то идет на страницу \nавторизации/регистрации
Сайт->База_данных: Запрос в таблицу Мастера
База_данных->Сайт: Список
Сайт->Пользователь: Выдача списка \nдоступных мастеров
... Пользователь...
Пользователь->Сайт: Желает сделать отзыв \nна услуги к мастеру
Сайт->База_данных: Запись в таблицу отзыв
База_данных->Сайт: Результат дейстия
Сайт->Пользователь: Сообщение об успехе/не удаче
... Администратор...
Администратор->Сайт: Желает просмотреть \nотзывы без ответа
Сайт->База_данных: Запрос н обработанных отзывов
База_данных->Сайт: Результат дейстия
Сайт->Администратор: Список не обработанных отзывов
Администратор->Сайт: Ответ на отзыв
Сайт->База_данных: Запись нового ответа
База_данных->Сайт: Результат дейстия
Сайт->Администратор: Сообщение об успехе/не удаче
== Статистика посещения ==
Администратор->Сайт: Желает просмотреть \nстатистику посещений сайта \nили конкртного мастера
Сайт->Сайт: Пользователь авторизован? \nесли нет, то идет на страницу \nавторизации/регистрации
Сайт->База_данных: Запрос в таблицы статистика
База_данных->Сайт: Результат дейстия
Сайт->Администратор: Список посещений
Приложение 3. Код SQL для создания таблиц
CREATE TABLE `Master` (
`ID` INT NOT NULL,
`id_users` INT NOT NULL,
`name` VARCHAR(255) NOT NULL,
`isDostupen` BINARY NOT NULL,
`foto_filename` VARCHAR(255) NOT NULL,
`opisanie` VARCHAR(255) NOT NULL,
PRIMARY KEY (`ID`)
);
CREATE TABLE `Statistik` (
`ID` INT NOT NULL AUTO_INCREMENT,
`browser` TEXT(255) NOT NULL,
`ip` VARCHAR(15) NOT NULL,
`host` VARCHAR(255) NOT NULL,
`refferer` VARCHAR(255) NOT NULL,
`time` VARCHAR(30) NOT NULL,
`request` VARCHAR(255) NOT NULL,
PRIMARY KEY (`ID`)
);
CREATE TABLE `Otzivi` (
`ID` INT NOT NULL AUTO_INCREMENT,
`ID_master` INT NOT NULL,
`ID_user` INT NOT NULL,
`stars` INT NOT NULL,
`text_user` VARCHAR(255) NOT NULL,
`text_admin` VARCHAR(255) NOT NULL,
PRIMARY KEY (`ID`)
);
CREATE TABLE `users` (
`ID` INT NOT NULL AUTO_INCREMENT,
`login` VARCHAR(30) NOT NULL,
`password` VARCHAR(32) NOT NULL,
`hash` VARCHAR(32) NOT NULL DEFAULT '''',
`isAdmin` BOOLEAN NOT NULL,
`isMaster` BOOLEAN NOT NULL,
`name` VARCHAR(50) NOT NULL,
`e-mail` VARCHAR(50) NOT NULL,
`telefon` VARCHAR(50) NOT NULL,
PRIMARY KEY (`ID`)
);
CREATE TABLE `users_visit` (
`id` INT NOT NULL AUTO_INCREMENT,
`id_users` INT NOT NULL,
`time_in` VARCHAR(30) NOT NULL,
`time_long` VARCHAR(30) NOT NULL,
`browser` INT NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `Zapis` (
`id` INT NOT NULL AUTO_INCREMENT,
`master_id` INT NOT NULL,
`datetime` VARCHAR(50) NOT NULL,
`datetime_end` VARCHAR(50) NOT NULL,
`id_user` INT(50) NOT NULL,
`money` FLOAT NOT NULL,
PRIMARY KEY (`id`)
);
ALTER TABLE `Master` ADD CONSTRAINT `Master_fk0` FOREIGN KEY (`id_users`) REFERENCES `users`(`ID`);
ALTER TABLE `Otzivi` ADD CONSTRAINT `Otzivi_fk0` FOREIGN KEY (`ID_master`) REFERENCES `users`(`ID`);
ALTER TABLE `Otzivi` ADD CONSTRAINT `Otzivi_fk1` FOREIGN KEY (`ID_user`) REFERENCES `users`(`ID`);
ALTER TABLE `users_visit` ADD CONSTRAINT `users_visit_fk0` FOREIGN KEY (`id_users`) REFERENCES `users`(`ID`);
ALTER TABLE `users_visit` ADD CONSTRAINT `users_visit_fk1` FOREIGN KEY (`browser`) REFERENCES `Statistik`(`ID`);
ALTER TABLE `Zapis` ADD CONSTRAINT `Zapis_fk0` FOREIGN KEY (`master_id`) REFERENCES `Master`(`ID`);
ALTER TABLE `Zapis` ADD CONSTRAINT `Zapis_fk1` FOREIGN KEY (`id_user`) REFERENCES `users`(`ID`);
Приложение 4. Код CSS табилицы стилей
*
{
margin: 0;
padding: 0;
}
body
{
font-family: arial,sans-serif;
}
.table-wrapper
{
margin: 30px;
border: solid 1px Silver;
padding: 10px;
display: inline-block;
}
.table-wrapper table
{
}
.table-wrapper table thead tr td div
{
color: #666;
text-align: center;
overflow: hidden;
background-color: White;
margin: 1px;
cursor: pointer;
padding: 8px 0;
font-size: 9pt;
font-weight: bold;
overflow: hidden;
border: solid 1px silver;
width: 80px;
background: url(../images/grad.png) left bottom repeat-x;
}
.table-wrapper table thead tr td div:hover
{
color: #555;
border-color: #bfbfbf;
background: url(../images/gradRev.png) left bottom repeat-x;
}
.table-wrapper table thead tr td.hovered div
{
color: #444;
}
.table-wrapper table thead tr td div.selected, .table-wrapper table thead tr td div.selected:hover
{
background: url(../images/ggrad.png) left -2px repeat-x;
border-color: #b7c4df;
color: #444;
}
.table-wrapper table tbody tr td div
{
border: solid 1px #ddd;
height: 25px;
cursor: pointer;
margin: 1px;
}
.table-wrapper table tbody tr td.hovered div
{
border-color: #ccc;
background: url(../images/ggrad2.png) left bottom repeat-x;
}
.table-wrapper table tbody tr td div.selected, .table-wrapper table tbody tr td div.selected:hover
{
background: url(../images/ggrad.png) left -2px repeat-x;
border-color: #b7c4df;
}
.table-wrapper table tbody tr td div:hover
{
border-color: #ccc;
background: url(../images/ggrad2.png) left bottom repeat-x;
}
.table-wrapper table tbody tr td div.selected:hover
{
}
.table-wrapper table tbody tr td:first-child div
{
padding: 1px 3px;
vertical-align: top;
font-size: 9pt;
cursor: default;
text-align: right;
margin: 0;
border: solid 1px White;
font-weight: bold;
color: #777;
}
.table-wrapper table tbody tr.hovered td:first-child div
{
color: #333;
border-color: White;
background: none;
}
.table-wrapper table tbody tr td:first-child div:hover
{
color: #777;
}
.ResultsHolder input
{
margin: 10px 40px;
}
.ResultsHolder #output
{
font-family: Courier New;
font-size: 10px;
padding: 20px;
}
Приложение 5. Код JS Пользовательские скрипты
(function($) {
$(function() {
$('table').wrap('<div class="table-wrapper"></div>');
var $body = $(document.body),
$html = $(document.documentElement),
$portf = $('.portfolio-main .wrapper-picture-mobile .dooble-bl'),
isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
function menuWidth() {
var winWidth = window.matchMedia('only screen and (min-width : 768px)').matches,
MenuUl = $('.wrapper-top-menu .top-menu'),
count_li = MenuUl.find('> li').length-1;
if ( winWidth && count_li ) {
var width_li = 0, menuTWidth = MenuUl.width();
MenuUl.find('> li').each(function() {
width_li += Math.ceil($(this).outerWidth());
});
if ( menuTWidth < width_li ) {
MenuUl.append("<li class='popup_menu'><a href='javascript:void(0);'>...</a><ul class='level-2'></ul></li>");
menuTWidth -= Math.ceil(MenuUl.find('> li.popup_menu').outerWidth());
for ( var i = count_li; menuTWidth < width_li; i-- ) {
width_li -= MenuUl.find('> li:not(popup_menu)').eq(i).outerWidth();
MenuUl.find('> li.popup_menu > ul').prepend(MenuUl.find('> li:not(popup_menu)').eq(i));
}
}
}
}
$(window).on('load resize', function() {
menuWidth();
});
var cntGroup = 2;
divsArr = $portf.get();
for(var i = 0; i < $portf.length; i += cntGroup){
$(divsArr.slice(i,i+cntGroup)).wrapAll('<div class="port"></div>');
}
// Отзывы
var slider_click = $('.reviews-block .review').length > 2 ? true : false;
if (slider_click) {
$('.reviews-wrapper .reviews-block').css('padding-bottom','60px');
}
for ($rw = 0; $rw < $('.site-container .owl-review').length; $rw++) {
if ($('.owl-review').eq($rw).find('.review').length > 1) {
$('.owl-review').eq($rw).owlCarousel({
responsiveClass:true,
loop: true,
responsive: {
768: {
nav: slider_click,
items: 2,
dots: false,
center: false,
mouseDrag: slider_click,
touchDrag: slider_click
},
0: {
nav: true,
items: 1,
center: true,
mouseDrag: true,
touchDrag: true
}
}
});