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