Add project files.

This commit is contained in:
2025-03-25 22:59:42 +04:00
parent 20e9f92f3a
commit 4445accb75
30 changed files with 1424 additions and 0 deletions

View File

@@ -0,0 +1,58 @@
<Window x:Class="SportsTrainingApp.formActivity"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SportsTrainingApp"
mc:Ignorable="d"
Title="Система учета спортивных тренировок" Height="450" Width="800" Icon="/free-icon-fitness-4729328.png" WindowStartupLocation="CenterScreen">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="0.3*"></RowDefinition>
<RowDefinition Height="0.5*"></RowDefinition>
<RowDefinition Height="0.5*"></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<TextBlock x:Name="tbCurUser" Grid.Column="0" Grid.Row="0" Grid.ColumnSpan="6"
Text="Текущий пользователь: " VerticalAlignment="Center" HorizontalAlignment="Center"/>
<DataGrid Grid.Column="0" Grid.Row="3" x:Name="gridActivity" AutoGenerateColumns="False"
ColumnWidth="*" Grid.ColumnSpan="6" Grid.RowSpan="3" Margin="10" IsReadOnly="True">
<DataGrid.Resources>
<Style TargetType="TextBlock" x:Key="WrapText">
<Setter Property="TextBlock.TextWrapping" Value="Wrap" />
</Style>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
<Style TargetType="DataGridCell">
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding ID}" Visibility="Hidden" />
<DataGridTextColumn Header="Вид спорта" Binding="{Binding Name}"/>
<DataGridTextColumn Header="Дата" Binding="{Binding Date}" />
<DataGridTextColumn Header="Длительность (мин.)" Binding="{Binding Duration}" ElementStyle="{StaticResource WrapText}"/>
<DataGridTextColumn Header="Интенсивность" Binding="{Binding Intensity}" ElementStyle="{StaticResource WrapText}"/>
<DataGridTextColumn Header="Заметки" Binding="{Binding Notes}" ElementStyle="{StaticResource WrapText}"/>
</DataGrid.Columns>
</DataGrid>
<Button Grid.Column="0" Grid.Row="2" x:Name="btnAddActivity" Grid.ColumnSpan="2" Margin="10" Content="Добавить занятие в план" Click="btnAddActivity_Click"/>
<Button Grid.Column="2" Grid.Row="2" x:Name="btnUpdActivity" Grid.ColumnSpan="2" Margin="10" Content="Изменить занятие в плане" Click="btnUpdActivity_Click"/>
<Button Grid.Column="4" Grid.Row="2" x:Name="btnDelActivity" Grid.ColumnSpan="2" Margin="10" Content="Удалить занятие" Click="btnDelActivity_Click"/>
<Button Grid.Column="0" Grid.Row="1" x:Name="btNutrition" Grid.ColumnSpan="3" Margin="10" Content="Питание" Click="btNutrition_Click"/>
<Button Grid.Column="3" Grid.Row="1" x:Name="btChallenges" Grid.ColumnSpan="3" Margin="10" Content="Испытание" Click="btChallenges_Click"/>
</Grid>
</Window>

View File

@@ -0,0 +1,141 @@
using System.Windows;
using System.Windows.Data;
using Npgsql;
using SportsTrainingApp.Activity;
using SportsTrainingApp.Challenges;
using SportsTrainingApp.Nutrition;
namespace SportsTrainingApp
{
/// <summary>
/// Interaction logic for formActivity.xaml
/// </summary>
public partial class formActivity : Window
{
int user_id = -1;
public formActivity(int _user_id)
{
InitializeComponent();
user_id = _user_id;
ShowCurUser(user_id);
FillDataGrid(user_id);
}
public class Workout
{
public int ID { get; set; }
public string? Name { get; set; }
public DateTime Date { get; set; }
public int Duration { get; set; }
public string? Intensity { get; set; }
public string? Notes { get; set; }
}
private void ShowCurUser(int _user_id)
{
using (var conn = new NpgsqlConnection(formMain.connectionString))
{
conn.Open();
using (var cmd = new NpgsqlCommand($@"SELECT
CONCAT(USERNAME, ' (email - ', EMAIL, ')')
FROM
DBO.USERS
WHERE
ID = {_user_id}", conn))
{
var reader = cmd.ExecuteReader();
if (reader.Read())
{
tbCurUser.Text += reader.GetString(0);
}
}
}
}
public void FillDataGrid(int _user_id)
{
using (var conn = new NpgsqlConnection(formMain.connectionString))
{
conn.Open();
using (var cmd = new NpgsqlCommand($@"SELECT
WORKOUTS.ID,
S.NAME,
DATE,
DURATION,
INTENSITY,
NOTES
FROM
DBO.WORKOUTS
LEFT JOIN DBO.SPORTS S ON S.ID = WORKOUTS.SPORT_ID
WHERE
USER_ID = {_user_id}
ORDER BY DATE", conn))
{
var reader = cmd.ExecuteReader();
var workouts = new List<Workout>();
while (reader.Read())
{
workouts.Add(new Workout
{
ID = reader.GetInt32(0),
Name = reader.GetString(1),
Date = reader.GetDateTime(2),
Duration = reader.GetInt32(3),
Intensity = reader.GetString(4),
Notes = reader.GetString(5)
});
}
gridActivity.ItemsSource = workouts;
}
}
}
private void btnAddActivity_Click(object sender, RoutedEventArgs e)
{
new formAddActivity(user_id).ShowDialog();
FillDataGrid(user_id);
}
private void btnDelActivity_Click(object sender, RoutedEventArgs e)
{
var selectedItem = (Workout)gridActivity.SelectedItem;
if (selectedItem == null)
return;
using (var conn = new NpgsqlConnection(formMain.connectionString))
{
conn.Open();
using (var cmd = new NpgsqlCommand(@$"DELETE FROM DBO.WORKOUTS
WHERE
ID = {selectedItem.ID}",conn))
{
cmd.ExecuteNonQuery();
}
}
FillDataGrid(user_id);
}
private void btnUpdActivity_Click(object sender, RoutedEventArgs e)
{
var selectedItem = (Workout)gridActivity.SelectedItem;
if (selectedItem == null)
return;
new formUpdActivity(selectedItem).ShowDialog();
FillDataGrid(user_id);
}
private void btNutrition_Click(object sender, RoutedEventArgs e)
{
new formNutrition(user_id).ShowDialog();
}
private void btChallenges_Click(object sender, RoutedEventArgs e)
{
new formChallenges().ShowDialog();
}
}
}

View File

@@ -0,0 +1,35 @@
<Window x:Class="SportsTrainingApp.Activity.formAddActivity"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SportsTrainingApp.Activity"
mc:Ignorable="d"
Title="Добавить занятие" Height="150" Width="800" ResizeMode="NoResize" Icon="/free-icon-fitness-4729328.png" WindowStartupLocation="CenterScreen">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.5*"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="2*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*"></RowDefinition>
<RowDefinition ></RowDefinition>
<RowDefinition ></RowDefinition>
</Grid.RowDefinitions>
<ComboBox x:Name="cbSports" Grid.Row="1" Grid.Column="0" Height="25" Margin="10"/>
<DatePicker Name="dtPicker" Grid.Row="1" Grid.Column="1" Height="25" Margin="10"/>
<TextBox x:Name="tbDuration" Grid.Row="1" Grid.Column="2" Height="25" Margin="10"/>
<TextBox x:Name="tbIntensivity" Grid.Row="1" Grid.Column="3" Height="25" Margin="10"/>
<TextBox x:Name="tbNote" Grid.Row="1" Grid.Column="4" Height="25" Margin="10"/>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Вид спорта" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="Дата" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="2" Text="Длительность (мин.)" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="3" Text="Интенсивность" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="4" Text="Примечание" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<Button Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="3" Height="25" Width="200" Content="Добавить" Click="Button_Click_1"/>
<Button Grid.Column="3" Grid.Row="2" Grid.ColumnSpan="3" Height="25" Width="200" Content="Отмена" Click="Button_Click_2"/>
</Grid>
</Window>

View File

@@ -0,0 +1,93 @@
using System.Windows;
using System.Windows.Controls;
using Npgsql;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace SportsTrainingApp.Activity
{
/// <summary>
/// Interaction logic for formAddActivity.xaml
/// </summary>
public partial class formAddActivity : Window
{
int user_id = -1;
public formAddActivity(int _user_id)
{
InitializeComponent();
user_id = _user_id;
FillCbSports(cbSports);
dtPicker.SelectedDate = DateTime.Now;
}
public class SportType
{
public int id { get; set; }
public string name { get; set; }
}
public void FillCbSports(ComboBox cb)
{
var items = GetData();
cbSports.ItemsSource = items;
cbSports.DisplayMemberPath = "name";
cbSports.SelectedValuePath = "id";
cbSports.SelectedIndex = 0;
}
private List<SportType> GetData()
{
var items = new List<SportType>();
string query = "SELECT id, name FROM dbo.sports";
using (var connection = new NpgsqlConnection(formMain.connectionString))
{
connection.Open();
using (var command = new NpgsqlCommand(query, connection))
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
items.Add(new SportType
{
id = reader.GetInt32(0),
name = reader.GetString(1)
});
}
}
}
return items;
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
this.Close();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
AddActivity();
}
private void AddActivity()
{
using (var conn = new NpgsqlConnection(formMain.connectionString))
{
conn.Open();
using (var cmd = new NpgsqlCommand("INSERT INTO dbo.workouts(user_id, sport_id, date, duration, intensity, notes) " +
"VALUES(@user_id, @sport_id, @date, @duration, @intensity, @note); ", conn))
{
cmd.Parameters.AddWithValue("user_id", user_id);
cmd.Parameters.AddWithValue("date", dtPicker.SelectedDate.Value);
cmd.Parameters.AddWithValue("sport_id", cbSports.SelectedValue);
cmd.Parameters.AddWithValue("duration", Convert.ToInt32(tbDuration.Text));
cmd.Parameters.AddWithValue("intensity", tbIntensivity.Text);
cmd.Parameters.AddWithValue("note", tbNote.Text);
cmd.ExecuteNonQuery();
}
this.Close();
}
}
}
}

View File

@@ -0,0 +1,35 @@
<Window x:Class="SportsTrainingApp.Activity.formUpdActivity"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SportsTrainingApp.Activity"
mc:Ignorable="d"
Title="Изменить занятие" Height="150" Width="800" ResizeMode="NoResize" Icon="/free-icon-fitness-4729328.png" WindowStartupLocation="CenterScreen">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.5*"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="2*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*"></RowDefinition>
<RowDefinition ></RowDefinition>
<RowDefinition ></RowDefinition>
</Grid.RowDefinitions>
<ComboBox x:Name="cbSports" Grid.Row="1" Grid.Column="0" Height="25" Margin="10"/>
<DatePicker Name="dtPicker" Grid.Row="1" Grid.Column="1" Height="25" Margin="10"/>
<TextBox x:Name="tbDuration" Grid.Row="1" Grid.Column="2" Height="25" Margin="10"/>
<TextBox x:Name="tbIntensivity" Grid.Row="1" Grid.Column="3" Height="25" Margin="10"/>
<TextBox x:Name="tbNote" Grid.Row="1" Grid.Column="4" Height="25" Margin="10"/>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Вид спорта" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="Дата" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="2" Text="Длительность (мин.)" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="3" Text="Интенсивность" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="4" Text="Примечание" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<Button Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="3" Height="25" Width="200" Content="Изменить" Click="ButtonUpd_Click"/>
<Button Grid.Column="3" Grid.Row="2" Grid.ColumnSpan="3" Height="25" Width="200" Content="Отмена" Click="ButtonCancel_Click"/>
</Grid>
</Window>

View File

@@ -0,0 +1,102 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using Npgsql;
namespace SportsTrainingApp.Activity
{
/// <summary>
/// Interaction logic for formUpdActivity.xaml
/// </summary>
public partial class formUpdActivity : Window
{
formActivity.Workout item;
public formUpdActivity(formActivity.Workout _item)
{
InitializeComponent();
item = _item;
FillFormFields(item);
}
private void FillFormFields(formActivity.Workout _item)
{
FillCbSports(cbSports);
for (int i = 0; i < cbSports.Items.Count; i++)
{
var sport = cbSports.Items[i] as SportType;
if (_item.Name == sport?.name.ToString())
{
cbSports.SelectedIndex = i;
}
}
dtPicker.SelectedDate = _item.Date;
tbDuration.Text = _item.Duration.ToString();
tbIntensivity.Text = _item.Intensity?.ToString();
tbNote.Text = _item.Notes?.ToString();
}
public class SportType
{
public int id { get; set; }
public string name { get; set; }
}
public void FillCbSports(ComboBox cb)
{
var items = GetData();
cbSports.ItemsSource = items;
cbSports.DisplayMemberPath = "name";
cbSports.SelectedValuePath = "id";
}
private List<SportType> GetData()
{
var items = new List<SportType>();
string query = "SELECT id, name FROM dbo.sports";
using (var connection = new NpgsqlConnection(formMain.connectionString))
{
connection.Open();
using (var command = new NpgsqlCommand(query, connection))
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
items.Add(new SportType
{
id = reader.GetInt32(0),
name = reader.GetString(1)
});
}
}
}
return items;
}
private void ButtonCancel_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void ButtonUpd_Click(object sender, RoutedEventArgs e)
{
using (var conn = new NpgsqlConnection(formMain.connectionString))
{
conn.Open();
using(var cmd = new NpgsqlCommand(@$"UPDATE dbo.workouts
SET sport_id=@sport_id, date=@date, duration=@dur, intensity=@intensity, notes=@notes
WHERE id = {item.ID};", conn))
{
cmd.Parameters.AddWithValue("date", dtPicker.SelectedDate.Value);
cmd.Parameters.AddWithValue("sport_id", cbSports.SelectedValue);
cmd.Parameters.AddWithValue("dur", Convert.ToInt32(tbDuration.Text));
cmd.Parameters.AddWithValue("intensity", tbIntensivity.Text);
cmd.Parameters.AddWithValue("notes", tbNote.Text);
cmd.ExecuteNonQuery();
}
}
this.Close();
}
}
}

9
App.xaml Normal file
View File

@@ -0,0 +1,9 @@
<Application x:Class="SportsTrainingApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SportsTrainingApp"
StartupUri="formMain.xaml">
<Application.Resources>
</Application.Resources>
</Application>

13
App.xaml.cs Normal file
View File

@@ -0,0 +1,13 @@
using System.Configuration;
using System.Data;
using System.Windows;
namespace SportsTrainingApp;
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}

10
AssemblyInfo.cs Normal file
View File

@@ -0,0 +1,10 @@
using System.Windows;
[assembly:ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]

View File

@@ -0,0 +1,32 @@
<Window x:Class="SportsTrainingApp.Challenges.formAddChallenges"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SportsTrainingApp.Challenges"
mc:Ignorable="d"
Title="Добавить испытание" Height="150" Width="800" ResizeMode="NoResize" Icon="/free-icon-fitness-4729328.png" WindowStartupLocation="CenterScreen">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*"></RowDefinition>
<RowDefinition ></RowDefinition>
<RowDefinition ></RowDefinition>
</Grid.RowDefinitions>
<TextBox x:Name="tbName" Grid.Row="1" Grid.Column="0" Height="25" Margin="10"/>
<TextBox x:Name="tbDescription" Grid.Row="1" Grid.Column="1" Height="25" Margin="10"/>
<DatePicker x:Name="dtStart" Grid.Row="1" Grid.Column="2" Height="25" Margin="10"/>
<DatePicker x:Name="dtEnd" Grid.Row="1" Grid.Column="3" Height="25" Margin="10"/>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Название" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="Описание" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="2" Text="Дата начала" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="3" Text="Дата окончания" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<Button Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Height="25" Width="200" Content="Добавить" Click="Button_Click_1"/>
<Button Grid.Column="2" Grid.Row="2" Grid.ColumnSpan="2" Height="25" Width="200" Content="Отмена" Click="Button_Click_2"/>
</Grid>
</Window>

View File

@@ -0,0 +1,46 @@
using System.Windows;
using Npgsql;
namespace SportsTrainingApp.Challenges
{
public partial class formAddChallenges : Window
{
public formAddChallenges()
{
InitializeComponent();
dtStart.SelectedDate = DateTime.Now;
dtEnd.SelectedDate = DateTime.Now.AddDays(1);
}
private void AddChallenges()
{
using (var conn = new NpgsqlConnection(formMain.connectionString))
{
conn.Open();
using (var cmd = new NpgsqlCommand($@"INSERT INTO dbo.challenges(
name, description, start_date, end_date)
VALUES (@name, @description, @start_date, @end_date);", conn))
{
cmd.Parameters.AddWithValue("name", tbName.Text);
cmd.Parameters.AddWithValue("description", tbDescription.Text);
cmd.Parameters.AddWithValue("start_date", dtStart.SelectedDate);
cmd.Parameters.AddWithValue("end_date", dtEnd.SelectedDate);
cmd.ExecuteNonQuery();
}
this.Close();
}
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
AddChallenges();
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
this.Close();
}
}
}

View File

@@ -0,0 +1,45 @@
<Window x:Class="SportsTrainingApp.Challenges.formChallenges"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SportsTrainingApp.Challenges"
mc:Ignorable="d"
Title="Испытание" Height="450" Width="800" Icon="/free-icon-fitness-4729328.png" WindowStartupLocation="CenterScreen">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="0.2*"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<DataGrid Grid.Column="0" Grid.Row="3" x:Name="gridChallenges" AutoGenerateColumns="False"
ColumnWidth="*" Grid.ColumnSpan="3" Margin="10" IsReadOnly="True">
<DataGrid.Resources>
<Style TargetType="TextBlock" x:Key="WrapText">
<Setter Property="TextBlock.TextWrapping" Value="Wrap" />
</Style>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
<Style TargetType="DataGridCell">
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="id" Binding="{Binding ID}" Visibility="Hidden" />
<DataGridTextColumn Header="Название" Binding="{Binding Name}" />
<DataGridTextColumn Header="Описание" Binding="{Binding Description}" ElementStyle="{StaticResource WrapText}"/>
<DataGridTextColumn Header="Дата начала" Binding="{Binding Start_date}" ElementStyle="{StaticResource WrapText}"/>
<DataGridTextColumn Header="Дата окончания" Binding="{Binding End_date}" ElementStyle="{StaticResource WrapText}"/>
</DataGrid.Columns>
</DataGrid>
<Button x:Name="btAddChallenges" Grid.Column="0" Grid.Row="0" Content="Добавить" Margin="10" Click="btAddChallenges_Click"/>
<Button x:Name="btUpdChallenges" Grid.Column="1" Grid.Row="0" Content="Изменить" Margin="10" Click="btUpdChallenges_Click"/>
<Button x:Name="btDelChallenges" Grid.Column="2" Grid.Row="0" Content="Удалить" Margin="10" Click="btDelChallenges_Click"/>
</Grid>
</Window>

View File

@@ -0,0 +1,96 @@
using Npgsql;
using System.Windows;
namespace SportsTrainingApp.Challenges
{
public partial class formChallenges : Window
{
public formChallenges()
{
InitializeComponent();
FillDataGrid();
}
public class Challenges
{
public int ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public DateTime Start_date { get; set; }
public DateTime End_date { get; set; }
}
public void FillDataGrid()
{
using (var conn = new NpgsqlConnection(formMain.connectionString))
{
conn.Open();
using (var cmd = new NpgsqlCommand($@"SELECT
ID,
NAME,
DESCRIPTION,
START_DATE,
END_DATE
FROM
DBO.CHALLENGES
ORDER BY
START_DATE", conn))
{
var reader = cmd.ExecuteReader();
var challenges = new List<Challenges>();
while (reader.Read())
{
challenges.Add(new Challenges
{
ID = reader.GetInt32(0),
Name = reader.GetString(1),
Description = reader.GetString(2),
Start_date = reader.GetDateTime(3),
End_date = reader.GetDateTime(4)
});
}
gridChallenges.ItemsSource = challenges;
}
}
}
private void btAddChallenges_Click(object sender, RoutedEventArgs e)
{
new formAddChallenges().ShowDialog();
FillDataGrid();
}
private void btDelChallenges_Click(object sender, RoutedEventArgs e)
{
var selectedItem = (Challenges)gridChallenges.SelectedItem;
if (selectedItem == null)
return;
using (var conn = new NpgsqlConnection(formMain.connectionString))
{
conn.Open();
using (var cmd = new NpgsqlCommand(@$"DELETE FROM DBO.CHALLENGES
WHERE
ID = {selectedItem.ID}", conn))
{
cmd.ExecuteNonQuery();
}
}
FillDataGrid();
}
private void btUpdChallenges_Click(object sender, RoutedEventArgs e)
{
var selectedItem = (Challenges)gridChallenges.SelectedItem;
if (selectedItem == null)
return;
new formUpdChallenges(selectedItem).ShowDialog();
FillDataGrid();
}
}
}

View File

@@ -0,0 +1,32 @@
<Window x:Class="SportsTrainingApp.Challenges.formUpdChallenges"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SportsTrainingApp.Challenges"
mc:Ignorable="d"
Title="Изменить испытание" Height="150" Width="800" ResizeMode="NoResize" Icon="/free-icon-fitness-4729328.png" WindowStartupLocation="CenterScreen">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*"></RowDefinition>
<RowDefinition ></RowDefinition>
<RowDefinition ></RowDefinition>
</Grid.RowDefinitions>
<TextBox x:Name="tbName" Grid.Row="1" Grid.Column="0" Height="25" Margin="10"/>
<TextBox x:Name="tbDescription" Grid.Row="1" Grid.Column="1" Height="25" Margin="10"/>
<DatePicker x:Name="dtStart" Grid.Row="1" Grid.Column="2" Height="25" Margin="10"/>
<DatePicker x:Name="dtEnd" Grid.Row="1" Grid.Column="3" Height="25" Margin="10"/>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Название" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="Описание" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="2" Text="Дата начала" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="3" Text="Дата окончания" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<Button Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Height="25" Width="200" Content="Изменить" Click="Button_Click_1"/>
<Button Grid.Column="2" Grid.Row="2" Grid.ColumnSpan="2" Height="25" Width="200" Content="Отмена" Click="Button_Click_2"/>
</Grid>
</Window>

View File

@@ -0,0 +1,49 @@
using System.Windows;
using Npgsql;
namespace SportsTrainingApp.Challenges
{
public partial class formUpdChallenges : Window
{
formChallenges.Challenges item;
public formUpdChallenges(formChallenges.Challenges _item)
{
InitializeComponent();
item = _item;
FillFormFields(item);
}
private void FillFormFields(formChallenges.Challenges _item)
{
tbName.Text = _item.Name;
tbDescription.Text = _item.Description;
dtEnd.SelectedDate = _item.End_date.Date;
dtStart.SelectedDate = _item.Start_date.Date;
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
this.Close();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
using (var conn = new NpgsqlConnection(formMain.connectionString))
{
conn.Open();
using (var cmd = new NpgsqlCommand(@$"UPDATE dbo.challenges
SET name=@name, description=@description, start_date=@start_date, end_date=@end_date
WHERE id = {item.ID};", conn))
{
cmd.Parameters.AddWithValue("name", tbName.Text);
cmd.Parameters.AddWithValue("description", tbDescription.Text);
cmd.Parameters.AddWithValue("start_date", dtStart.SelectedDate);
cmd.Parameters.AddWithValue("end_date", dtEnd.SelectedDate);
cmd.ExecuteNonQuery();
}
}
this.Close();
}
}
}

View File

@@ -0,0 +1,35 @@
<Window x:Class="SportsTrainingApp.Nutrition.formAddNutrition"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SportsTrainingApp.Nutrition"
mc:Ignorable="d"
Title="Добавить питание" Height="150" Width="800" ResizeMode="NoResize" Icon="/free-icon-fitness-4729328.png" WindowStartupLocation="CenterScreen">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*"></RowDefinition>
<RowDefinition ></RowDefinition>
<RowDefinition ></RowDefinition>
</Grid.RowDefinitions>
<DatePicker Name="dtPicker" Grid.Row="1" Grid.Column="0" Height="25" Margin="10"/>
<TextBox x:Name="tbCalories" Grid.Row="1" Grid.Column="1" Height="25" Margin="10"/>
<TextBox x:Name="tbProtein" Grid.Row="1" Grid.Column="2" Height="25" Margin="10"/>
<TextBox x:Name="tbCarbs" Grid.Row="1" Grid.Column="3" Height="25" Margin="10"/>
<TextBox x:Name="tbFats" Grid.Row="1" Grid.Column="4" Height="25" Margin="10"/>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Дата" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="Калории" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="2" Text="Белки" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="3" Text="Углеводы" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="4" Text="Жиры" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<Button Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Height="25" Width="200" Content="Добавить" Click="Button_Click_1"/>
<Button Grid.Column="3" Grid.Row="2" Grid.ColumnSpan="2" Height="25" Width="200" Content="Отмена" Click="Button_Click_2"/>
</Grid>
</Window>

View File

@@ -0,0 +1,50 @@
using System.Windows;
using Npgsql;
namespace SportsTrainingApp.Nutrition
{
/// <summary>
/// Interaction logic for formAddNutrition.xaml
/// </summary>
public partial class formAddNutrition : Window
{
int user_id = -1;
public formAddNutrition(int _user_id)
{
InitializeComponent();
user_id = _user_id;
dtPicker.SelectedDate = DateTime.Now;
}
private void AddNutrition()
{
using (var conn = new NpgsqlConnection(formMain.connectionString))
{
conn.Open();
using (var cmd = new NpgsqlCommand($@"INSERT INTO dbo.nutrition(
user_id, date, calories, protein, carbs, fats)
VALUES (@user_id, @date, @calories, @protein, @carbs, @fats);", conn))
{
cmd.Parameters.AddWithValue("user_id", user_id);
cmd.Parameters.AddWithValue("date", dtPicker.SelectedDate.Value);
cmd.Parameters.AddWithValue("calories", Convert.ToInt32(tbCalories.Text));
cmd.Parameters.AddWithValue("protein", Convert.ToDouble(tbProtein.Text));
cmd.Parameters.AddWithValue("carbs", Convert.ToDouble(tbCarbs.Text));
cmd.Parameters.AddWithValue("fats", Convert.ToDouble(tbFats.Text));
cmd.ExecuteNonQuery();
}
this.Close();
}
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
AddNutrition();
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
this.Close();
}
}
}

View File

@@ -0,0 +1,47 @@
<Window x:Class="SportsTrainingApp.Nutrition.formNutrition"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SportsTrainingApp.Nutrition"
mc:Ignorable="d"
Title="Питание" Height="450" Width="800" Icon="/free-icon-fitness-4729328.png" WindowStartupLocation="CenterScreen">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="0.2*"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<DataGrid Grid.Column="0" Grid.Row="3" x:Name="gridNutrition" AutoGenerateColumns="False"
ColumnWidth="*" Grid.ColumnSpan="3" Margin="10" IsReadOnly="True">
<DataGrid.Resources>
<Style TargetType="TextBlock" x:Key="WrapText">
<Setter Property="TextBlock.TextWrapping" Value="Wrap" />
</Style>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
<Style TargetType="DataGridCell">
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="id" Binding="{Binding ID}" Visibility="Hidden" />
<DataGridTextColumn Header="user_id" Binding="{Binding User_id}" Visibility="Hidden"/>
<DataGridTextColumn Header="Дата" Binding="{Binding Date}" />
<DataGridTextColumn Header="Калории" Binding="{Binding Calories}" ElementStyle="{StaticResource WrapText}"/>
<DataGridTextColumn Header="Белки" Binding="{Binding Protein}" ElementStyle="{StaticResource WrapText}"/>
<DataGridTextColumn Header="Углеводы" Binding="{Binding Carbs}" ElementStyle="{StaticResource WrapText}"/>
<DataGridTextColumn Header="Жиры" Binding="{Binding Fats}" ElementStyle="{StaticResource WrapText}"/>
</DataGrid.Columns>
</DataGrid>
<Button x:Name="btAddNutrition" Grid.Column="0" Grid.Row="0" Content="Добавить" Margin="10" Click="btAddNutrition_Click"/>
<Button x:Name="btUpdNutrution" Grid.Column="1" Grid.Row="0" Content="Изменить" Margin="10" Click="btUpdNutrution_Click"/>
<Button x:Name="btDelNutrition" Grid.Column="2" Grid.Row="0" Content="Удалить" Margin="10" Click="btDelNutrition_Click"/>
</Grid>
</Window>

View File

@@ -0,0 +1,107 @@
using Npgsql;
using System.Windows;
namespace SportsTrainingApp.Nutrition
{
/// <summary>
/// Interaction logic for fromNutrition.xaml
/// </summary>
public partial class formNutrition : Window
{
int user_id = -1;
public formNutrition(int _user_id)
{
InitializeComponent();
user_id = _user_id;
FillDataGrid(user_id);
}
public class Nutrition
{
public int ID { get; set; }
public int User_id { get; set; }
public DateTime Date { get; set; }
public int Calories { get; set; }
public double Protein { get; set; }
public double Carbs { get; set; }
public double Fats { get; set; }
}
public void FillDataGrid(int _user_id)
{
using (var conn = new NpgsqlConnection(formMain.connectionString))
{
conn.Open();
using (var cmd = new NpgsqlCommand($@"SELECT
ID,
USER_ID,
DATE,
CALORIES,
PROTEIN,
CARBS,
FATS
FROM
DBO.NUTRITION
WHERE
USER_ID = {_user_id}
ORDER BY DATE", conn))
{
var reader = cmd.ExecuteReader();
var nutrition = new List<Nutrition>();
while (reader.Read())
{
nutrition.Add(new Nutrition
{
ID = reader.GetInt32(0),
User_id = reader.GetInt32(1),
Date = reader.GetDateTime(2),
Calories = reader.GetInt32(3),
Protein = reader.GetDouble(4),
Carbs = reader.GetDouble(5),
Fats = reader.GetDouble(6)
});
}
gridNutrition.ItemsSource = nutrition;
}
}
}
private void btAddNutrition_Click(object sender, RoutedEventArgs e)
{
new formAddNutrition(user_id).ShowDialog();
FillDataGrid(user_id);
}
private void btDelNutrition_Click(object sender, RoutedEventArgs e)
{
var selectedItem = (Nutrition)gridNutrition.SelectedItem;
if (selectedItem == null)
return;
using (var conn = new NpgsqlConnection(formMain.connectionString))
{
conn.Open();
using (var cmd = new NpgsqlCommand(@$"DELETE FROM DBO.NUTRITION
WHERE
ID = {selectedItem.ID}", conn))
{
cmd.ExecuteNonQuery();
}
}
FillDataGrid(user_id);
}
private void btUpdNutrution_Click(object sender, RoutedEventArgs e)
{
var selectedItem = (Nutrition)gridNutrition.SelectedItem;
if (selectedItem == null)
return;
new formUpdNutrition(selectedItem).ShowDialog();
FillDataGrid(user_id);
}
}
}

View File

@@ -0,0 +1,35 @@
<Window x:Class="SportsTrainingApp.Nutrition.formUpdNutrition"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SportsTrainingApp.Nutrition"
mc:Ignorable="d"
Title="Изменить питание" Height="150" Width="800" ResizeMode="NoResize" Icon="/free-icon-fitness-4729328.png" WindowStartupLocation="CenterScreen">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="0.5*"></RowDefinition>
<RowDefinition ></RowDefinition>
<RowDefinition ></RowDefinition>
</Grid.RowDefinitions>
<DatePicker Name="dtPicker" Grid.Row="1" Grid.Column="0" Height="25" Margin="10"/>
<TextBox x:Name="tbCalories" Grid.Row="1" Grid.Column="1" Height="25" Margin="10"/>
<TextBox x:Name="tbProtein" Grid.Row="1" Grid.Column="2" Height="25" Margin="10"/>
<TextBox x:Name="tbCarbs" Grid.Row="1" Grid.Column="3" Height="25" Margin="10"/>
<TextBox x:Name="tbFats" Grid.Row="1" Grid.Column="4" Height="25" Margin="10"/>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Дата" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="1" Text="Калории" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="2" Text="Белки" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="3" Text="Углеводы" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<TextBlock Grid.Row="0" Grid.Column="4" Text="Жиры" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center"/>
<Button Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" Height="25" Width="200" Content="Изменить" Click="Button_Click_1"/>
<Button Grid.Column="3" Grid.Row="2" Grid.ColumnSpan="2" Height="25" Width="200" Content="Отмена" Click="Button_Click_2"/>
</Grid>
</Window>

View File

@@ -0,0 +1,54 @@
using System.Windows;
using Npgsql;
namespace SportsTrainingApp.Nutrition
{
/// <summary>
/// Interaction logic for formUpdNutrition.xaml
/// </summary>
public partial class formUpdNutrition : Window
{
formNutrition.Nutrition item;
public formUpdNutrition(formNutrition.Nutrition _item)
{
InitializeComponent();
item = _item;
FillFormFields(item);
}
private void FillFormFields(formNutrition.Nutrition _item)
{
dtPicker.SelectedDate = _item.Date;
tbCalories.Text = _item.Calories.ToString();
tbCarbs.Text = _item.Carbs.ToString();
tbProtein.Text = _item.Protein.ToString();
tbFats.Text = _item.Fats.ToString();
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
this.Close();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
using (var conn = new NpgsqlConnection(formMain.connectionString))
{
conn.Open();
using (var cmd = new NpgsqlCommand(@$"UPDATE dbo.nutrition
SET user_id=@user_id, date=@date, calories=@calories, protein=@protein, carbs=@carbs, fats=@fats
WHERE id = {item.ID};", conn))
{
cmd.Parameters.AddWithValue("user_id", item.User_id);
cmd.Parameters.AddWithValue("date", dtPicker.SelectedDate.Value);
cmd.Parameters.AddWithValue("calories", Convert.ToInt32(tbCalories.Text));
cmd.Parameters.AddWithValue("protein", Convert.ToDouble(tbProtein.Text));
cmd.Parameters.AddWithValue("carbs", Convert.ToDouble(tbCarbs.Text));
cmd.Parameters.AddWithValue("fats", Convert.ToDouble(tbFats.Text));
cmd.ExecuteNonQuery();
}
}
this.Close();
}
}
}

41
SportsTrainingApp.csproj Normal file
View File

@@ -0,0 +1,41 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<None Remove="Activity\rajo4eib.oid~" />
<None Remove="free-icon-fitness-4729328.png" />
<None Remove="l2itol0i.q13~" />
<None Remove="MainWindow.xaml.cs~RF63ae882.TMP" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Npgsql" Version="9.0.3" />
</ItemGroup>
<ItemGroup>
<Resource Include="free-icon-fitness-4729328.png" />
</ItemGroup>
<ItemGroup>
<Compile Update="Challenges\formAddChallenges.xaml.cs">
<SubType>Code</SubType>
</Compile>
<Compile Update="Challenges\formChallenges.xaml.cs">
<SubType>Code</SubType>
</Compile>
<Compile Update="Challenges\formUpdChallenges.xaml.cs">
<SubType>Code</SubType>
</Compile>
<Compile Update="formLogin.xaml.cs">
<SubType>Code</SubType>
</Compile>
</ItemGroup>
</Project>

25
SportsTrainingApp.sln Normal file
View File

@@ -0,0 +1,25 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.13.35828.75 d17.13
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SportsTrainingApp", "SportsTrainingApp.csproj", "{76018E6A-7200-4E33-A2AE-152867198A3B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{76018E6A-7200-4E33-A2AE-152867198A3B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{76018E6A-7200-4E33-A2AE-152867198A3B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{76018E6A-7200-4E33-A2AE-152867198A3B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{76018E6A-7200-4E33-A2AE-152867198A3B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A06D3EF8-E3D3-4284-8150-A4FE3B0CCCEE}
EndGlobalSection
EndGlobal

33
formLogin.xaml Normal file
View File

@@ -0,0 +1,33 @@
<Window x:Class="SportsTrainingApp.formLogin"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SportsTrainingApp"
mc:Ignorable="d"
Title="Вход" Height="130" Width="400" WindowStartupLocation="CenterScreen" ResizeMode="NoResize" Icon="/free-icon-fitness-4729328.png">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.2*"></RowDefinition>
<RowDefinition Height="0.5*"></RowDefinition>
<RowDefinition Height="0.2*"></RowDefinition>
<RowDefinition Height="0.5*"></RowDefinition>
<RowDefinition Height="0.2*"></RowDefinition>
<RowDefinition Height="0.5*"></RowDefinition>
<RowDefinition Height="0.2*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.2*"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="0.2*"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="0.2*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button Grid.Column="1" Grid.Row="5" Content="Вход" Click="Button_Click_1" />
<Button Grid.Column="3" Grid.Row="5" Content="Отмена" Click="Button_Click_2"/>
<TextBox Grid.Column="1" Grid.Row="3" TextAlignment="Center" x:Name="loginBox"/>
<PasswordBox Grid.Column="3" Grid.Row="3" x:Name="passwordBox"/>
<TextBlock Grid.Column="1" Grid.Row="1" Text="Логин" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<TextBlock Grid.Column="3" Grid.Row="1" Text="Пароль" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Grid>
</Window>

59
formLogin.xaml.cs Normal file
View File

@@ -0,0 +1,59 @@
using System.Windows;
using System;
using Npgsql;
namespace SportsTrainingApp
{
public partial class formLogin : Window
{
formMain formMain;
public formLogin(formMain _formMain)
{
InitializeComponent();
formMain = _formMain;
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
this.Close();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
int user_id = CheckUser(loginBox.Text, passwordBox.Password);
if (user_id != -1)
{
new formActivity(user_id).Show();
this.Close();
formMain.Close();
}
else
MessageBox.Show("Неверный логин/пароль!");
}
public static int CheckUser(string username, string password)
{
using (var conn = new NpgsqlConnection(formMain.connectionString))
{
conn.Open();
using (var cmd = new NpgsqlCommand("SELECT id FROM dbo.users WHERE username = @username " +
"AND password_hash = dbo.crypt(@password, password_hash)", conn))
{
cmd.Parameters.AddWithValue("username", username);
cmd.Parameters.AddWithValue("password", password);
using (var reader = cmd.ExecuteReader())
{
if (reader.Read())
{
return reader.GetInt32(0);
}
}
return -1;
}
}
}
}
}

25
formMain.xaml Normal file
View File

@@ -0,0 +1,25 @@
<Window x:Class="SportsTrainingApp.formMain"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SportsTrainingApp"
mc:Ignorable="d"
Title="Система учета спортивных тренировок" Height="200" Width="300" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" Icon="/free-icon-fitness-4729328.png">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.2*"></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition Height="0.2*"></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition Height="0.2*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.2*"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="0.2*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button Grid.Column="1" Grid.Row="1" Content="Вход" Click="Button_Click_1" Margin="10"/>
<Button Grid.Column="1" Grid.Row="3" Content="Регистрация" Click="Button_Click_2" Margin="10"/>
</Grid>
</Window>

26
formMain.xaml.cs Normal file
View File

@@ -0,0 +1,26 @@
using System.Windows;
namespace SportsTrainingApp;
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class formMain : Window
{
public const string connectionString = "Host=192.168.0.110:5432;Username=KhasanovAM;Password=Admin123;Database=SportsTrainingApp";
public formMain()
{
InitializeComponent();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
var formLogin = new formLogin(this);
formLogin.ShowDialog();
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
new formRegistration().ShowDialog();
}
}

38
formRegistration.xaml Normal file
View File

@@ -0,0 +1,38 @@
<Window x:Class="SportsTrainingApp.formRegistration"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:SportsTrainingApp"
mc:Ignorable="d"
Title="Регистрация" Height="130" Width="600" WindowStartupLocation="CenterScreen" ResizeMode="NoResize" Icon="/free-icon-fitness-4729328.png">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.2*"></RowDefinition>
<RowDefinition Height="0.5*"></RowDefinition>
<RowDefinition Height="0.2*"></RowDefinition>
<RowDefinition Height="0.5*"></RowDefinition>
<RowDefinition Height="0.2*"></RowDefinition>
<RowDefinition Height="0.5*"></RowDefinition>
<RowDefinition Height="0.2*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.2*"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="0.2*"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="0.2*"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="0.2*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button Grid.Column="1" Grid.Row="5" Content="OK" Click="Button_Click_OK"/>
<Button Grid.Column="5" Grid.Row="5" Content="Отмена" Click="Button_Click_Cancel"/>
<Button Grid.Column="3" Grid.Row="5" Content="Показать пароль" Click="Button_Click_ShowPass"/>
<TextBox Grid.Column="1" Grid.Row="3" TextAlignment="Center" x:Name="loginBox"/>
<PasswordBox Grid.Column="3" Grid.Row="3" x:Name="passwordBox"/>
<TextBox Grid.Column="5" Grid.Row="3" TextAlignment="Center" x:Name="emailBox"/>
<TextBlock Grid.Column="1" Grid.Row="1" Text="Логин" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<TextBlock Grid.Column="3" Grid.Row="1" Text="Пароль" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<TextBlock Grid.Column="5" Grid.Row="1" Text="Email" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</Grid>
</Window>

53
formRegistration.xaml.cs Normal file
View File

@@ -0,0 +1,53 @@
using System.Windows;
using Npgsql;
namespace SportsTrainingApp
{
public partial class formRegistration : Window
{
public formRegistration()
{
InitializeComponent();
}
private void Button_Click_ShowPass(object sender, RoutedEventArgs e)
{
MessageBox.Show($"Ваш пароль: {passwordBox.Password}");
}
private void Button_Click_Cancel(object sender, RoutedEventArgs e)
{
this.Close();
}
private void Button_Click_OK(object sender, RoutedEventArgs e)
{
if (loginBox.Text == "" || passwordBox.Password == "" || emailBox.Text == "")
{
MessageBox.Show("Введены не все данные.");
return;
}
CreateUser(loginBox.Text, passwordBox.Password, emailBox.Text);
this.Close();
}
private static void CreateUser(string username, string password, string email)
{
using (var conn = new NpgsqlConnection(formMain.connectionString))
{
conn.Open();
using (var cmd = new NpgsqlCommand("INSERT INTO dbo.users (username, email, password_hash) " +
"VALUES (@username, @email, dbo.crypt(@password, dbo.gen_salt('bf')))", conn))
{
cmd.Parameters.AddWithValue("username", username);
cmd.Parameters.AddWithValue("email", email);
cmd.Parameters.AddWithValue("password", password);
cmd.ExecuteNonQuery();
}
}
MessageBox.Show("Пользователь создан!");
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB