
- •Введение
- •Анализ предметной области
- •Диаграммы прецедентов
- •Диаграммы взаимодействия
- •Диаграммы поведения
- •Проектирование бд с использованием case-средств
- •Создание сайта с использованием ms Visual Studio Разметка и наполнение сайта
- •Реализация личного кабинета пользователя
- •Фильтрация данных
- •Администрирование базы данных
- •Заключение
- •Список использованной литературы
- •Приложение а
- •Приложение б
- •Приложение в
- •Приложение г
- •Приложение д
- •Приложение е
- •Приложение ж
- •Приложение з
- •Приложение и
Диаграммы взаимодействия
Реализована диаграмма последовательности для прецедента «Авторизация» с точки зрения зарегистрированного пользователя (Рисунок 5).
Рисунок 5- Диаграмма последовательности для прецедента «Авторизация»
Также создана диаграмма кооперации для прецедента «Авторизация» и диаграммы последовательности и кооперации для прецедента «Бронирование тура» (Рисунок 6-8).
Рисунок
6 - Диаграмма кооперации для прецедента
«Авторизаци
Рисунок 7 - Диаграмма последовательности для прецедента «Бронирование тура»
Рисунок 8 - Диаграмма кооперации для прецедента «Бронирование тура»
Диаграммы поведения
Реализована диаграмма состояний для объекта Путевка (Рисунок 9).
Рисунок 9- Диаграмма состояний для объекта Путевка
Затем создана диаграмма активности для процесса бронирования путевки (Рисунок 10). В процессе создания диаграммы выделены следующие сущности: Пользователи, Тур, Страна, Тип, Путевка, Заказ.
Рисунок 10 - Диаграмма активности для процесса бронирования путевки
Далее создана диаграмма активности с дорожками для процесса формирования путевки (Рисунок 11). В процессе создания диаграммы активности также использовались сущности Тур и Путевка.
Рисунок 11 - Диаграмма активности с дорожками для процесса формирования путевки
Проектирование бд с использованием case-средств
Выделены основные сущности:
Клиент - пользователь системы, который может заказывать туры, оставлять отзывы и участвовать в поездках.
Тур - комплексное предложение для путешествия.
Маршрут - это путь, который охватывает тур.
Населенный пункт - это город или деревня, включенные в маршрут тура.
Вид тура - это категория, к которой относится тур.
Сезон - это временной период, в течение которого проводится тур.
Отель – это место проживания, предоставляемое клиентам в рамках тура.
Сотрудник - это человек, ответственный за организацию тура
Поездка - это конкретное путешествие, связанное с туром.
Путевка - это документ, подтверждающий бронирование тура для
клиента.
Заказ - это заявка на бронирование тура, оформленная клиентом.
Статус - это текущее состояние заказа.
Отзыв - это комментарий и оценка тура, которую оставляет клиент после путешествия.
В среде Erwin созданы логическая и физическая диаграммы (Рисунок 12-
13)
Рисунок 12- Логическая модель базы данных
Рисунок13- Физическая модель базы данных
Создано соединение SQL, и сгенерирована диаграмма базы данных (Рисунок 14-16).
Рисунок 14- Генерация кода
Рисунок 15- Сгенерированный код
Рисунок 16- ER-диаграмма базы данных
Создание сайта с использованием ms Visual Studio Разметка и наполнение сайта
Разработана структура сайта, создано навигационное меню для перехода между страницами (Рисунок 17).
Рисунок 16- Разметка сайта
Создана Главная страница, которая приветствует пользователя (Рисунок 17)
Рисунок 17 – Главная страница
Далее создана Новостная страница, на которой находится список новостей, реализованный с помощью ListView. Источником данных является таблица Новости в базе данных (Рисунок 18)
Рисунок 18 – Страница Новости
Реализация личного кабинета пользователя
Реализована регистрация пользователей. Введенные данные проверяются на корректность, выполняется подключение к базе данных, вычисляется новый идентификатор клиента, данные заносятся в таблицу Client. (Рисунок 19).
Рисунок 19- Форма регистрации пользователей
На рисунке 20 показано добавление пользователя в таблицу Клиент
Рисунок 20 – Добавление пользователя в таблицу Клиент
Листинг 1- Команда кнопки регистрации пользователя
protected void btnRegister_Click(object sender, EventArgs e)
{
// считывание данных из полей формы
string name = txtName.Text.Trim();
string surname = txtSurname.Text.Trim();
string patronymic = txtPatronymic.Text.Trim();
string dobText = txtDOB.Text.Trim();
string phone = txtPhone.Text.Trim();
string login = txtLogin.Text.Trim();
string password = txtPassword.Text.Trim();
if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(surname) || string.IsNullOrEmpty(phone) || string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password))
{
lblMessage.Text = "Все поля должны быть заполнены.";
return;
}
if (!DateTime.TryParse(dobText, out DateTime dob))
{
lblMessage.Text = "Некорректная дата рождения.";
return;
}
string connectionString = "Data Source=localhost;Initial Catalog=travel;Integrated Security=True";
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
string maxIdQuery = "SELECT ISNULL(MAX(Client_ID), 0) + 1 FROM Client";
int newClientID;
using (SqlCommand maxIdCommand = new SqlCommand(maxIdQuery, connection))
{
newClientID = (int)maxIdCommand.ExecuteScalar();
}
string insertQuery = "INSERT INTO Client (Client_ID, Name_C, Surname_C, Patronymic_C, DOB_C, Phone_C, LoginC, PasswordC) " + "VALUES (@ClientID, @Name, @Surname, @Patronymic, @DOB, @Phone, @Login, @Password)";
using (SqlCommand insertCommand = new SqlCommand(insertQuery, connection))
{
insertCommand.Parameters.AddWithValue("@ClientID", newClientID);
insertCommand.Parameters.AddWithValue("@Name", name);
insertCommand.Parameters.AddWithValue("@Surname", surname);
insertCommand.Parameters.AddWithValue("@Patronymic", patronymic);
insertCommand.Parameters.AddWithValue("@DOB", dob);
insertCommand.Parameters.AddWithValue("@Phone", phone);
insertCommand.Parameters.AddWithValue("@Login", login);
insertCommand.Parameters.AddWithValue("@Password", password);
int rowsAffected = insertCommand.ExecuteNonQuery();
if (rowsAffected > 0)
{
lblMessage.ForeColor = System.Drawing.Color.Green;
lblMessage.Text = "Регистрация прошла успешно!";
}
else
{
lblMessage.Text = "Ошибка регистрации. Попробуйте снова.";
}
}
}
}
catch (Exception ex)
{
lblMessage.Text = "Ошибка: " + ex.Message;
}
}
Затем реализована авторизация пользователя (Рисунок 21-22). При нажатии на кнопку Вход, выполняется проверка логина и пароля пользователя в базе данных, если данные корректны, программа сохраняет информацию о пользователе в сессии и перенаправляет на главную страницу, если неверны, отображает сообщение об ошибке (Листинг 2).
Также написана функция для проверки, авторизован ли пользователь, в зависимости от этого, появляются или скрываются элементы интерфейса. Также реализовано приветствие пользователя, если он вошел в систему. После нажатии авторизованного пользователя на кнопку Выход, происходит очищение данных сессии, и элементы интерфейса становятся видимыми для неавторизованного пользователя (Листинг 3)
Рисунок 21 – Главная страница до авторизации
Рисунок 22 - Главная страница после авторизации пользователя
Листинг 2- Функция кнопки входа
protected void btnLogin_Click(object sender, EventArgs e)
{
string login = txtUsername.Text.Trim();
string password = txtPassword.Text.Trim();
if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password))
{
lblMessage.Text = "Введите логин и пароль.";
lblMessage.ForeColor = System.Drawing.Color.Red;
return;
}
string connectionString = "Data Source=localhost;Initial Catalog=travel;Integrated Security=True";
string query = @"
SELECT 'Client' AS UserType, Client_ID AS UserId, Name_C AS FirstName
FROM Client WHERE LoginC = @Login AND PasswordC = @Password
UNION ALL
SELECT 'Employee' AS UserType, Employee_ID AS UserId, Name_E AS FirstName
FROM Employee WHERE LoginE = @Login AND PasswordE = @Password";
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(query, connection))
{
command.Parameters.AddWithValue("@Login", login);
command.Parameters.AddWithValue("@Password", password);
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
// Сохранение данных в сессии
Session["UserType"] = reader["UserType"].ToString();
Session["UserId"] = reader["UserId"].ToString();
Session["UserName"] = reader["FirstName"].ToString();
lblMessage.ForeColor = System.Drawing.Color.Green;
lblMessage.Text = "Вход выполнен успешно!";
Response.Redirect("Home.aspx");
}
else
{
lblMessage.Text = "Неверный логин или пароль.";
lblMessage.ForeColor = System.Drawing.Color.Red;
}
}
}
}
catch (Exception ex)
{
lblMessage.Text = "Ошибка: " + ex.Message;
lblMessage.ForeColor = System.Drawing.Color.Red;
}
}
Листинг 3- Функция кнопки выхода
protected void btnLogout_Click(object sender, EventArgs e)
{
Session.Clear();
txtUsername.Visible = true;
txtPassword.Visible = true;
lblLogin.Visible = true;
lblPassword.Visible = true;
btnLogin.Visible = true;
btnRegister.Visible = true;
btnLogout.Visible = false;
lblMessage.Text = "Вы успешно вышли.";
lblMessage.ForeColor = System.Drawing.Color.Green;
Response.Redirect("Home.aspx");
}
При переходе на страницу Редактирование профиля, пользователь может изменить свои данные (Рисунок 23-25).
Рисунок 23- Форма для редактирования данных пользователя
Рисунок 24- Обновление номера телефона пользователя
Рисунок 25- Проверка обновления данных
Листинг 4- Функция обновления данных
protected void btnSave_Click(object sender, EventArgs e)
{
if (Session["UserId"] == null)
{
lblMessage.Text = "Вы не авторизованы. Пожалуйста, войдите в систему.";
return;
}
int clientId = int.Parse(Session["UserId"].ToString());
string connectionString = "Data Source=localhost;Initial Catalog=travel;Integrated Security=True";
string query = @"
UPDATE Client
SET Name_C = @Name,
Surname_C = @Surname,
Patronymic_C = @Patronymic,
DOB_C = @DOB,
Phone_C = @Phone
WHERE Client_ID = @ClientID";
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{ SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@Name", txtName.Text);
command.Parameters.AddWithValue("@Surname", txtSurname.Text);
command.Parameters.AddWithValue("@Patronymic", txtPatronymic.Text);
command.Parameters.AddWithValue("@DOB", Convert.ToDateTime(txtDOB.Text));
command.Parameters.AddWithValue("@Phone", txtPhone.Text);
command.Parameters.AddWithValue("@ClientID", clientId);
connection.Open();
int rowsAffected = command.ExecuteNonQuery();
if (rowsAffected > 0)
{
lblSuccess.Text = "Данные успешно обновлены!";
lblMessage.Text = "";
}
else
{
lblMessage.Text = "Ошибка обновления данных.";
}
}
}
catch (Exception ex)
{
lblMessage.Text = "Ошибка сохранения данных: " + ex.Message;
}
}
}