
Безопасность сетей / EventLog (2)
.rtf
CREATE DATABASE RealEstateRental;
GO
USE RealEstateRental;
GO
CREATE TABLE Clients (
ClientID INT PRIMARY KEY IDENTITY(1,1),
FullName NVARCHAR(100) NOT NULL,
Phone NVARCHAR(20),
Email NVARCHAR(100),
PassportNumber NVARCHAR(20),
DateOfBirth DATE
);
-- Таблица недвижимости
CREATE TABLE Properties (
PropertyID INT PRIMARY KEY IDENTITY(1,1),
Address NVARCHAR(200) NOT NULL, -- Адрес объекта
Type NVARCHAR(50), -- Тип (например: квартира, дом, студия)
SquareMeters FLOAT, -- Площадь в квадратных метрах
Rooms INT, -- Количество комнат
PricePerMonth DECIMAL(10, 2), -- Арендная плата за месяц
IsAvailable BIT DEFAULT 1 -- Флаг доступности (1 = доступно, 0 = занято)
);
-- Таблица сотрудников (например, агенты по недвижимости)
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY IDENTITY(1,1), -- Уникальный ID сотрудника
FullName NVARCHAR(100) NOT NULL, -- ФИО сотрудника
Position NVARCHAR(50), -- Должность (например: агент, менеджер)
Phone NVARCHAR(20), -- Телефон
Email NVARCHAR(100) -- Email
);
-- Таблица аренд (связывает клиентов, объекты и сотрудников)
CREATE TABLE Rentals (
RentalID INT PRIMARY KEY IDENTITY(1,1), -- Уникальный ID аренды
ClientID INT NOT NULL, -- ID клиента, кто арендует (внешний ключ)
PropertyID INT NOT NULL, -- ID недвижимости (внешний ключ)
EmployeeID INT NOT NULL, -- ID сотрудника, оформившего сделку (внешний ключ)
StartDate DATE NOT NULL, -- Дата начала аренды
EndDate DATE, -- Дата окончания аренды (может быть NULL, если аренда активна)
TotalPrice DECIMAL(12, 2), -- Общая сумма аренды (можно посчитать по датам и цене)
Status NVARCHAR(20) DEFAULT 'Active', -- Статус аренды (например: Active, Completed, Cancelled)
-- Внешние ключи, связывающие аренду с другими таблицами
FOREIGN KEY (ClientID) REFERENCES Clients(ClientID),
FOREIGN KEY (PropertyID) REFERENCES Properties(PropertyID),
FOREIGN KEY (EmployeeID) REFERENCES Employees(EmployeeID)
);
-- Таблица уборок (по каждому объекту может быть несколько записей)
CREATE TABLE Cleanings (
CleaningID INT PRIMARY KEY IDENTITY(1,1), -- Уникальный ID записи об уборке
PropertyID INT NOT NULL, -- ID недвижимости, где проводилась уборка
CleaningDate DATE NOT NULL, -- Дата уборки
CleanerName NVARCHAR(100), -- Имя человека или компании, кто убирал
Notes NVARCHAR(255), -- Примечания к уборке (например: "генеральная", "перед заселением")
-- Внешний ключ: связь с объектом недвижимости
FOREIGN KEY (PropertyID) REFERENCES Properties(PropertyID)
);
ALTER TABLE Employees
ADD Login NVARCHAR(50) NOT NULL UNIQUE, -- Логин для входа
Password NVARCHAR(255) NOT NULL; -- Пароль (в идеале хранить хеш, но пока в виде строки)
using System;
using System.Data;
using System.Data.SqlClient; // Подключение к SQL Server
using System.Windows.Forms; // Для работы с Windows Forms
namespace RealEstateRentalApp
{
public partial class LoginForm : Form
{
// Строка подключения к SQL Server.
// Замени "YourServerName" на имя своего SQL-сервера (например: localhost, .\SQLEXPRESS, LAPTOP-ПУПКИН\SQLEXPRESS)
string connectionString = "Server=YourServerName;Database=RealEstateRental;Trusted_Connection=True;";
public LoginForm()
{
InitializeComponent(); // Инициализация компонентов формы
}
// Метод обработки нажатия кнопки "Войти"
private void btnLogin_Click(object sender, EventArgs e)
{
// Получаем значения из текстовых полей
string login = txtLogin.Text.Trim(); // Логин (удаляем лишние пробелы)
string password = txtPassword.Text.Trim(); // Пароль
// Проверка на пустые поля — базовая валидация
if (string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password))
{
lblError.Text = "Пожалуйста, введите логин и пароль."; // Сообщение об ошибке
return; // Останавливаем выполнение
}
// Создаем подключение к базе данных
using (SqlConnection conn = new SqlConnection(connectionString))
{
try
{
conn.Open(); // Открываем соединение с БД
// SQL-запрос для проверки наличия сотрудника с указанным логином и паролем
string query = "SELECT COUNT(*) FROM Employees WHERE Login = @login AND Password = @password";
// Создаем команду с параметрами, чтобы избежать SQL-инъекций
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@login", login); // Подставляем логин
cmd.Parameters.AddWithValue("@password", password); // Подставляем пароль
// Выполняем запрос и получаем количество подходящих записей
int count = (int)cmd.ExecuteScalar();
if (count == 1)
{
// Если такой сотрудник найден — авторизация успешна
MessageBox.Show("Авторизация прошла успешно!", "Добро пожаловать");
// Здесь можно открыть главную форму приложения
// MainForm main = new MainForm();
// main.Show();
// this.Hide(); // Скрываем форму входа
}
else
{
// Если нет совпадений — неверный логин или пароль
lblError.Text = "Неверный логин или пароль.";
}
}
catch (Exception ex)
{
// Если что-то пошло не так (например, ошибка подключения) — выводим сообщение
MessageBox.Show("Ошибка подключения к базе данных: " + ex.Message);
}
}
}
}
}
Reg
using System;
using System.Data.SqlClient; // Для работы с SQL Server
using System.Windows.Forms; // Windows Forms
namespace RealEstateRentalApp
{
public partial class RegisterForm : Form
{
// Строка подключения к БД — измени "YourServerName" на свой инстанс
string connectionString = "Server=YourServerName;Database=RealEstateRental;Trusted_Connection=True;";
public RegisterForm()
{
InitializeComponent(); // Инициализация визуальных компонентов
}
// Обработка кнопки "Зарегистрироваться"
private void btnRegister_Click(object sender, EventArgs e)
{
// Получаем данные из полей формы
string fullName = txtFullName.Text.Trim();
string position = txtPosition.Text.Trim();
string phone = txtPhone.Text.Trim();
string email = txtEmail.Text.Trim();
string login = txtLogin.Text.Trim();
string password = txtPassword.Text.Trim();
// Базовая валидация: проверяем, чтобы все поля были заполнены
if (string.IsNullOrEmpty(fullName) || string.IsNullOrEmpty(position) ||
string.IsNullOrEmpty(phone) || string.IsNullOrEmpty(email) ||
string.IsNullOrEmpty(login) || string.IsNullOrEmpty(password))
{
lblError.Text = "Пожалуйста, заполните все поля.";
return;
}
using (SqlConnection conn = new SqlConnection(connectionString))
{
try
{
conn.Open(); // Открываем соединение с БД
// Проверяем, существует ли уже сотрудник с таким логином
string checkQuery = "SELECT COUNT(*) FROM Employees WHERE Login = @login";
SqlCommand checkCmd = new SqlCommand(checkQuery, conn);
checkCmd.Parameters.AddWithValue("@login", login);
int exists = (int)checkCmd.ExecuteScalar();
if (exists > 0)
{
lblError.Text = "Пользователь с таким логином уже существует.";
return;
}
// Запрос для вставки нового сотрудника
string insertQuery = @"INSERT INTO Employees
(FullName, Position, Phone, Email, Login, Password)
VALUES (@fullName, @position, @phone, @email, @login, @password)";
SqlCommand insertCmd = new SqlCommand(insertQuery, conn);
insertCmd.Parameters.AddWithValue("@fullName", fullName);
insertCmd.Parameters.AddWithValue("@position", position);
insertCmd.Parameters.AddWithValue("@phone", phone);
insertCmd.Parameters.AddWithValue("@email", email);
insertCmd.Parameters.AddWithValue("@login", login);
insertCmd.Parameters.AddWithValue("@password", password); // В проде нужно хэшировать
int rowsAffected = insertCmd.ExecuteNonQuery();
if (rowsAffected > 0)
{
MessageBox.Show("Регистрация прошла успешно!", "Готово");
// Можно перейти на форму логина или закрыть текущую
// LoginForm loginForm = new LoginForm();
// loginForm.Show();
// this.Close();
}
else
{
lblError.Text = "Ошибка при добавлении пользователя.";
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка: " + ex.Message);
}
}
}
}
}