Файл: Разработка сайта для парикмахерской.pdf

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

Категория: Курсовая работа

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

Добавлен: 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

}

}

});