Добавил:
support-vk-server-knmcadiknmcadibav.ru Сайт моих друзей из VKT NDA : https://support-vk-server-knmcadiknmcadibav.ru/about/ ila_iv_id566844132@dnevnik.ru VK Testers NDA (тестировщик) QA. Студент 4 курса. +79009627198 https://vk.cc/help #HLKLesNarod# Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
05.07.2025
Размер:
24.76 Кб
Скачать

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);

}

}

}

}

}

Соседние файлы в папке Безопасность сетей