Bläddra i källkod

Initial commit

AndreevArtiom 2 veckor sedan
incheckning
3b9a135fdb
5 ändrade filer med 483 tillägg och 0 borttagningar
  1. 5 0
      .gitignore
  2. 25 0
      pm_11.sln
  3. 390 0
      pm_11/Program.cs
  4. 49 0
      pm_11/install.bat
  5. 14 0
      pm_11/pm_11.csproj

+ 5 - 0
.gitignore

@@ -0,0 +1,5 @@
+bin/
+obj/
+.vs/
+*.user
+*.suo

+ 25 - 0
pm_11.sln

@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.11.35312.102
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pm_11", "pm_11\pm_11.csproj", "{DF9F3AB8-F0C4-49D8-8FBD-1B9C2759BCF2}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{DF9F3AB8-F0C4-49D8-8FBD-1B9C2759BCF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DF9F3AB8-F0C4-49D8-8FBD-1B9C2759BCF2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DF9F3AB8-F0C4-49D8-8FBD-1B9C2759BCF2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DF9F3AB8-F0C4-49D8-8FBD-1B9C2759BCF2}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {B3DF21EF-F607-41BF-AF66-11F44AACD030}
+	EndGlobalSection
+EndGlobal

+ 390 - 0
pm_11/Program.cs

@@ -0,0 +1,390 @@
+using System.Text;
+using Npgsql;
+
+class TrainingDatabase
+{
+    private NpgsqlConnection conn;
+
+    private bool IsValidPhone(string phone)
+    {
+        if (phone.Length != 11) return false;
+        foreach (char c in phone)
+        {
+            if (!char.IsDigit(c)) return false;
+        }
+        return true;
+    }
+
+    private void ExecuteQuery(string query, NpgsqlParameter[] parameters = null)
+    {
+        using (var cmd = new NpgsqlCommand(query, conn))
+        {
+            if (parameters != null)
+                cmd.Parameters.AddRange(parameters);
+
+            try
+            {
+                cmd.ExecuteNonQuery();
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine("Ошибка: " + ex.Message);
+            }
+        }
+    }
+
+    private bool IsConnected()
+    {
+        return conn.State == System.Data.ConnectionState.Open;
+    }
+
+    public TrainingDatabase()
+    {
+        string connectionString = "Host=edu-pg.itiscaf.ru;Port=5432;Database=dbwork;Username=andreev_as;Password=S5#&H680$KE";
+        conn = new NpgsqlConnection(connectionString);
+
+        try
+        {
+            conn.Open();
+            Console.WriteLine("Подключение успешно");
+        }
+        catch (Exception ex)
+        {
+            Console.WriteLine("Не удалось подключиться к базе данных: " + ex.Message);
+            Environment.Exit(1);
+        }
+    }
+
+    ~TrainingDatabase()
+    {
+        if (conn != null)
+            conn.Close();
+    }
+
+    private string ConvertToUtf8(string text)
+    {
+        if (string.IsNullOrEmpty(text)) return text;
+        byte[] win1251Bytes = Encoding.GetEncoding(1251).GetBytes(text);
+        return Encoding.UTF8.GetString(win1251Bytes);
+    }
+
+    public void AddUser()
+    {
+        string name, secondName, lastName, phone;
+        int membershipId;
+
+        Console.Write("Имя: ");
+        name = Console.ReadLine();
+        Console.Write("Фамилия: ");
+        secondName = Console.ReadLine();
+        Console.Write("Отчество: ");
+        lastName = Console.ReadLine();
+        Console.Write("Телефон (11 цифр): ");
+        phone = Console.ReadLine();
+
+        if (!IsValidPhone(phone))
+        {
+            Console.WriteLine("Ошибка: телефон должен содержать 11 цифр");
+            return;
+        }
+        Console.Write("id абонемента: ");
+        membershipId = int.Parse(Console.ReadLine());
+
+        string getMembershipQuery = "select total_sessions, validity_days from membership where id = @id";
+
+        using (var cmd = new NpgsqlCommand(getMembershipQuery, conn))
+        {
+            cmd.Parameters.AddWithValue("@id", membershipId);
+            using (var reader = cmd.ExecuteReader())
+            {
+                if (reader.Read())
+                {
+                    int totalSessions = reader.GetInt32(0);
+                    int validityDays = reader.GetInt32(1);
+                    DateTime validUntil = DateTime.Now.AddDays(validityDays);
+
+                    reader.Close();
+
+                    string insertQuery = "insert into users_gym (users_name, users_second_name, users_last_name, phone, membership_id, remaining_sessions, valid_until) values (@name, @secondName, @lastName, @phone, @membershipId, @remaining, @validUntil)";
+
+                    using (var insertCmd = new NpgsqlCommand(insertQuery, conn))
+                    {
+                        insertCmd.Parameters.AddWithValue("@name", name);
+                        insertCmd.Parameters.AddWithValue("@secondName", secondName);
+                        insertCmd.Parameters.AddWithValue("@lastName", lastName);
+                        insertCmd.Parameters.AddWithValue("@phone", phone);
+                        insertCmd.Parameters.AddWithValue("@membershipId", membershipId);
+                        insertCmd.Parameters.AddWithValue("@remaining", totalSessions);
+                        insertCmd.Parameters.AddWithValue("@validUntil", validUntil);
+
+                        int rows = insertCmd.ExecuteNonQuery();
+                    }
+
+                    Console.WriteLine("Пользователь добавлен");
+                }
+                else
+                {
+                    Console.WriteLine("Абонемент с таким id не найден");
+                }
+            }
+        }
+    }
+
+    public void AddTraining()
+    {
+        string sessionDate;
+        int userId, coachId, hallId;
+
+        Console.Write("id пользователя: ");
+        userId = int.Parse(Console.ReadLine());
+        Console.Write("id тренера: ");
+        coachId = int.Parse(Console.ReadLine());
+        Console.Write("id зала: ");
+        hallId = int.Parse(Console.ReadLine());
+        Console.Write("Дата тренировки (гггг-мм-дд): ");
+        sessionDate = Console.ReadLine();
+
+        DateTime date;
+        if (!DateTime.TryParse(sessionDate, out date))
+        {
+            Console.WriteLine("Неверный формат даты");
+            return;
+        }
+
+        string query = "insert into training_session (session_date, user_id, coach_id, hall_id) values (@date, @userId, @coachId, @hallId)";
+
+        using (var cmd = new NpgsqlCommand(query, conn))
+        {
+            cmd.Parameters.AddWithValue("@date", date);
+            cmd.Parameters.AddWithValue("@userId", userId);
+            cmd.Parameters.AddWithValue("@coachId", coachId);
+            cmd.Parameters.AddWithValue("@hallId", hallId);
+            cmd.ExecuteNonQuery();
+        }
+
+        Console.WriteLine("Тренировка добавлена");
+    }
+
+    public void EditUser()
+    {
+        int userId;
+        string phone;
+        int remainingSessions;
+        string validUntil;
+
+        Console.Write("id пользователя для редактирования: ");
+        userId = int.Parse(Console.ReadLine());
+        Console.Write("Новый телефон: ");
+        phone = Console.ReadLine();
+
+        if (!IsValidPhone(phone))
+        {
+            Console.WriteLine("Ошибка: телефон должен содержать 11 цифр");
+            return;
+        }
+
+        Console.Write("Новый остаток тренировок: ");
+        remainingSessions = int.Parse(Console.ReadLine());
+        Console.Write("Новая дата окончания (гггг-мм-дд): ");
+        validUntil = Console.ReadLine();
+
+        DateTime date;
+        if (!DateTime.TryParse(validUntil, out date))
+        {
+            Console.WriteLine("Неверный формат даты");
+            return;
+        }
+
+        string query = "update users_gym set phone = @phone, remaining_sessions = @remaining, valid_until = @validUntil where id = @id";
+
+        using (var cmd = new NpgsqlCommand(query, conn))
+        {
+            cmd.Parameters.AddWithValue("@phone", phone);
+            cmd.Parameters.AddWithValue("@remaining", remainingSessions);
+            cmd.Parameters.AddWithValue("@validUntil", date);
+            cmd.Parameters.AddWithValue("@id", userId);
+            cmd.ExecuteNonQuery();
+        }
+
+        Console.WriteLine("Данные пользователя обновлены");
+    }
+
+    public void DeleteUser()
+    {
+        int userId;
+        Console.Write("id пользователя для удаления: ");
+        userId = int.Parse(Console.ReadLine());
+
+        string query1 = "delete from training_session where user_id = @id";
+        using (var cmd = new NpgsqlCommand(query1, conn))
+        {
+            cmd.Parameters.AddWithValue("@id", userId);
+            cmd.ExecuteNonQuery();
+        }
+
+        string query2 = "delete from users_gym where id = @id";
+        using (var cmd = new NpgsqlCommand(query2, conn))
+        {
+            cmd.Parameters.AddWithValue("@id", userId);
+            cmd.ExecuteNonQuery();
+        }
+
+        Console.WriteLine("Пользователь удален");
+    }
+
+    public void SearchUsers()
+    {
+        string searchTerm;
+        Console.Write("Введите фамилию для поиска: ");
+        searchTerm = Console.ReadLine();
+
+        string query = "select id, convert_from(users_name::bytea, 'UTF8') as users_name, convert_from(users_second_name::bytea, 'UTF8') as users_second_name, convert_from(users_last_name::bytea, 'UTF8') as users_last_name, phone, remaining_sessions, valid_until from users_gym where users_second_name ilike @search order by users_second_name";
+
+        using (var cmd = new NpgsqlCommand(query, conn))
+        {
+            cmd.Parameters.AddWithValue("@search", "%" + searchTerm + "%");
+            using (var reader = cmd.ExecuteReader())
+            {
+                if (!reader.HasRows)
+                {
+                    Console.WriteLine("Ничего не найдено");
+                    return;
+                }
+
+                var results = new List<string[]>();
+                while (reader.Read())
+                {
+                    var row = new string[reader.FieldCount];
+                    Console.WriteLine($"\nid: {reader["id"]}");
+                    Console.WriteLine($"Имя: {reader["users_name"]}");
+                    Console.WriteLine($"Фамилия: {reader["users_second_name"]}");
+                    Console.WriteLine($"Отчество: {reader["users_last_name"]}");
+                    Console.WriteLine($"Телефон: {reader["phone"]}");
+                    Console.WriteLine($"Остаток тренировок: {reader["remaining_sessions"]}");
+                    Console.WriteLine($"Абонемент действует до: {reader["valid_until"]} \n");
+
+                    for (int i = 0; i < reader.FieldCount; i++)
+                    {
+                        row[i] = reader.GetValue(i).ToString();
+                    }
+                    results.Add(row);
+                }
+                Console.WriteLine($"Найдено {results.Count} записей");
+                ExportToCsv(results);
+            }
+        }
+    }
+
+    public void ShowAllUsers()
+    {
+        string query = "select id, users_name, users_second_name, users_last_name, phone, remaining_sessions, valid_until from users_gym order by id";
+
+        using (var cmd = new NpgsqlCommand(query, conn))
+        using (var reader = cmd.ExecuteReader())
+        {
+            if (!reader.HasRows)
+            {
+                Console.WriteLine("Нет данных в таблице");
+                return;
+            }
+
+            while (reader.Read())
+            {
+                Console.WriteLine($"\nid: {reader["id"]}");
+                Console.WriteLine($"Имя: {reader["users_name"]}");
+                Console.WriteLine($"Фамилия: {reader["users_second_name"]}");
+                Console.WriteLine($"Отчество: {reader["users_last_name"]}");
+                Console.WriteLine($"Телефон: {reader["phone"]}");
+                Console.WriteLine($"Остаток тренировок: {reader["remaining_sessions"]}");
+                Console.WriteLine($"Абонемент действует до: {reader["valid_until"]}\n");
+            }
+        }
+    }
+
+    private void ExportToCsv(List<string[]> data)
+    {
+        string filename = "export_" + DateTime.Now.Ticks + ".csv";
+
+        using (var file = new StreamWriter(filename, false, Encoding.UTF8))
+        {
+            if (data.Count > 0)
+            {
+                for (int i = 0; i < data[0].Length; i++)
+                {
+                    file.Write($"Column{i + 1}");
+                    if (i < data[0].Length - 1) file.Write(",");
+                }
+                file.WriteLine();
+
+                foreach (var row in data)
+                {
+                    for (int i = 0; i < row.Length; i++)
+                    {
+                        file.Write(row[i]);
+                        if (i < row.Length - 1) file.Write(",");
+                    }
+                    file.WriteLine();
+                }
+            }
+        }
+        Console.WriteLine("Файл сохранён в: " + Directory.GetCurrentDirectory());
+    }
+
+    public void ShowMenu()
+    {
+        int choice;
+        while (true)
+        {
+            Console.WriteLine();
+            Console.WriteLine("1. Показать всех пользователей");
+            Console.WriteLine("2. Добавить пользователя");
+            Console.WriteLine("3. Добавить тренировку");
+            Console.WriteLine("4. Редактировать пользователя");
+            Console.WriteLine("5. Удалить пользователя");
+            Console.WriteLine("6. Поиск пользователей");
+            Console.WriteLine("0. Выход");
+            Console.Write("Выбор: ");
+
+            if (!int.TryParse(Console.ReadLine(), out choice))
+            {
+                Console.WriteLine("Неверный выбор");
+                continue;
+            }
+
+            switch (choice)
+            {
+                case 1:
+                    ShowAllUsers();
+                    break;
+                case 2:
+                    AddUser();
+                    break;
+                case 3:
+                    AddTraining();
+                    break;
+                case 4:
+                    EditUser();
+                    break;
+                case 5:
+                    DeleteUser();
+                    break;
+                case 6:
+                    SearchUsers();
+                    break;
+                case 0:
+                    return;
+                default:
+                    Console.WriteLine("Неверный выбор");
+                    break;
+            }
+        }
+    }
+
+    static void Main()
+    {
+        Console.OutputEncoding = Encoding.UTF8;
+        Console.WriteLine("Учёт тренировок спортсменов");
+        TrainingDatabase db = new TrainingDatabase();
+        db.ShowMenu();
+    }
+}

+ 49 - 0
pm_11/install.bat

@@ -0,0 +1,49 @@
+@echo off
+cd /d "%~dp0"
+chcp 65001 >nul
+echo УСТАНОВКА СИСТЕМЫ УЧЕТА ТРЕНИРОВОК
+echo.
+
+echo 1. Проверка .NET...
+dotnet --version >nul 2>&1
+if errorlevel 1 (
+    echo ОШИБКА: .NET не установлена
+    echo Скачайте с сайта: https://dotnet.microsoft.com/download
+    pause
+    exit /b 1
+)
+echo ...OK
+echo.
+
+echo 2. Сборка проекта...
+dotnet build -c Release
+echo ...OK
+echo.
+
+echo 3. Очистка и копирование файлов в C:\TrainingApp...
+rmdir /s /q C:\TrainingApp 2>nul
+mkdir C:\TrainingApp
+xcopy /E /Y "bin\Release\net8.0\*" "C:\TrainingApp\"
+echo ...OK
+echo.
+
+echo 4. Проверка: файл скопирован?
+if exist "C:\TrainingApp\pm_11.exe" (
+    echo Файл найден: C:\TrainingApp\pm_11.exe
+) else (
+    echo ОШИБКА: файл не скопирован! Проверь папку bin\Release\net8.0\
+    pause
+    exit /b 1
+)
+
+echo 5. Создание ярлыка на рабочем столе...
+echo [InternetShortcut] > "%USERPROFILE%\Desktop\TrainingApp.url"
+echo URL="C:\TrainingApp\pm_11.exe" >> "%USERPROFILE%\Desktop\TrainingApp.url"
+echo WorkingDirectory="C:\TrainingApp\" >> "%USERPROFILE%\Desktop\TrainingApp.url"
+echo IconFile="C:\TrainingApp\pm_11.exe" >> "%USERPROFILE%\Desktop\TrainingApp.url"
+echo ...OK
+echo.
+
+echo УСТАНОВКА ЗАВЕРШЕНА!
+echo Ярлык создан на рабочем столе
+pause

+ 14 - 0
pm_11/pm_11.csproj

@@ -0,0 +1,14 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Npgsql" Version="10.0.3" />
+  </ItemGroup>
+
+</Project>