///////////////////////////////////////////////////////////////////////////////////////// MainWindows интерфейс
///////////////////////////////////////////////////////////////////////////////////////// Стили
///////////////////////////////////////////////////////////////////////////////////////// Код авторизации
/////////////////////////////////////////////////////////////////////////////////////////XAML
/////////////////////////////////////////////////////////////////////////////////////////C#
public static User user;
public static bool correctValue;
int kolError;
int countTime;
DispatcherTimer disTimer = new DispatcherTimer();
public Login()
{
InitializeComponent();
user = null;
kolError = 0; // кол-во неудачных входов
correctValue = false; // корректность ввода капчи
disTimer.Interval = new TimeSpan(0, 0, 1); // интервал времени для таймера
disTimer.Tick += new EventHandler(DisTimer_Tick);
}
private void BtnLogin_Click(object sender, RoutedEventArgs e)
{
User user1 = Base.date.User.FirstOrDefault(x => x.UserLogin == TBLogin.Text && x.UserPassword == TBPassword.Text);
if (user1 != null)
{
if (kolError == 0)
{
FrameClass.frame.Navigate(new ListProducts());
}
else
{
correctValue = false;
CAPCHA captcha = new CAPCHA();
captcha.ShowDialog();
if (correctValue) // Если капча пройдена
{
user = user1;
FrameClass.frame.Navigate(new ListProducts());
}
}
}
else
{
MessageBox.Show("Пользователь с таким логиным и паролем не найден!");
correctValue = false;
CAPCHA captcha = new CAPCHA();
captcha.ShowDialog();
kolError++;
if (!correctValue) // Если капча не пройдена
{
BtnLogin.IsEnabled = false;
countTime = 10;
tbNewCode.Text = "Повторно авторизоваться можно через " + countTime + " секунд";
tbNewCode.Visibility = Visibility.Visible;
disTimer.Start();
}
}
}
private void BtnGuest_Click(object sender, RoutedEventArgs e)
{
FrameClass.frame.Navigate(new ListProducts());
}
private void BtnRegistration_Click(object sender, RoutedEventArgs e)
{
FrameClass.frame.Navigate(new Registration());
}
private void DisTimer_Tick(object sender, EventArgs e)
{
if (countTime == 0) // Если 10 секунд закончились
{
BtnLogin.IsEnabled = true;
disTimer.Stop();
tbNewCode.Visibility = Visibility.Collapsed;
}
else
{
tbNewCode.Text = "Повторно авторизоваться можно через " + countTime + " секунд";
}
countTime--;
}
}
///////////////////////////////////////////////////////////////////////////////////////// Каптча
///////////////////////////////////////////////////////////////////////////////////////// XAML
/////////////////////////////////////////////////////////////////////////////////////////C#
public string text;
public CAPCHA()
{
InitializeComponent();
Random rand = new Random();
int kolText = 4; // Количество символов в строке
text = "";
for (int i = 0; i < kolText; i++)
{
int j = rand.Next(2); // Выбор 0 - число; 1 - буква
if (j == 0)
{
text = text + rand.Next(9).ToString();
}
else
{
text = text + (char)rand.Next('a', 'z' + 1);
}
}
// Переменные для того, чтобы символы шли по порядку
int widthBegin = 0; // Начало отрезка
int widthEnd = 0; // Конец отрезка
int h = (int)CvField.Width / text.Length; // Шаг разбиения
for (int i = 0; i < text.Length; i++) // Заполнение текста
{
if (i == 0) // Если первое разбиение
{
widthEnd += h;
}
else
{
widthBegin = widthEnd;
widthEnd += h;
}
int height = rand.Next((int)CvField.Height);
int width = rand.Next(widthBegin, widthEnd);
if (height > 170) // Чтобы не выходило за пределы поля (30 - это самое большая высота символа)
{
height -= 30;
}
if (width > 590) // Чтобы не выходило за пределы поля (10 - это самое большая длина символа)
{
widthEnd -= 10;
}
int fontSize = rand.Next(16, 33);
TextBlock txt = new TextBlock()
{
Text = text[i].ToString(),
TextDecorations = TextDecorations.Strikethrough,
Padding = new Thickness(width, height, 0, 0),
FontSize = fontSize,
};
CvField.Children.Add(txt);
}
int kolLine = rand.Next(5, 16); // Рандомное количество линий
for (int i = 0; i < kolLine; i++)
{
SolidColorBrush brush = new SolidColorBrush(Color.FromRgb((byte)rand.Next(256), (byte)rand.Next(256), (byte)rand.Next(256))); // Рандомный RGB цвет
Line l = new Line()
{
X1 = rand.Next((int)CvField.Width),
Y1 = rand.Next((int)CvField.Height),
X2 = rand.Next((int)CvField.Width),
Y2 = rand.Next((int)CvField.Height),
Stroke = brush,
};
CvField.Children.Add(l);
}
}
private void BtnGo_Click(object sender, RoutedEventArgs e)
{
if (tbInputField.Text == text)
{
Login.correctValue = true;
this.Close();
}
else
{
this.Close();
}
}
}
///////////////////////////////////////////////////////////////////////////////////////// Регистрация
public partial class Registration : Page
{
public Registration()
{
InitializeComponent();
}
private void BtnLogin_Click(object sender, RoutedEventArgs e)
{
FrameClass.frame.Navigate(new Login());
}
private void BtnRegistration_Click(object sender, RoutedEventArgs e)
{
try
{
if(TBSurname.Text.Replace(" ", "").Length == 0)
{
MessageBox.Show("Фамилия не указана");
return;
}
if (TBName.Text.Replace(" ", "").Length == 0)
{
MessageBox.Show("Имя не указано");
return;
}
if (TBPatronomic.Text.Replace(" ", "").Length == 0)
{
MessageBox.Show("Отчество не указано");
return;
}
//Regex regex = new Regex("((?= ^[8])(.{ 11}$))| (?= ^\\+? (7))(.{ 12})$"); // Регулярное выражение для телефона
//DateTime dateTime = new DateTime();
//Console.WriteLine(dateTime); // 01.01.0001 0:00:00
//Console.WriteLine(DateTime.Now); // Текущая дата и время
//Console.WriteLine(DateTime.Today);
//DateTime date1 = new DateTime(2015, 7, 20, 18, 30, 25); // 20.07.2015 18:30:25
//Console.WriteLine(date1.AddHours(-3)); // 20.07.2015 15:30:25
//public TimeSpan (int hours, int minutes, int seconds);
//TimeSpan.FromDays(10) - TimeSpan.FromSeconds(1); // 9.23:59:59
Regex regex = new Regex("(?=.*[0-9].*[0-9])(?=.*[a-zA-Z])(?=.*[!@#$&*])^(.{4,6})$"); // Регулярное выражение для проверки пароля (минимум 2 цифры, 1 латинская буква и один спец символ (символов от 4 до 6))
if (regex.IsMatch(TBPassword.Text) == false)
{
MessageBox.Show("Пароль не соответствует требованиям");
return;
}
if (Base.date.User.Where(x => x.UserLogin == TBLogin.Text).ToList().Count > 0)
{
MessageBox.Show("Пользователь с таким логиным уже есть");
return;
}
User user = new User();
user.UserSurname = TBSurname.Text;
user.UserName = TBName.Text;
user.UserPatronymic = TBPatronomic.Text;
user.UserLogin = TBLogin.Text;
user.UserPassword = TBPassword.Text;
user.UserRole = 3;
Base.date.User.Add(user);
Base.date.SaveChanges();
MessageBox.Show("Пользователь зарегистрирован");
FrameClass.frame.Navigate(new Login());
}
catch
{
MessageBox.Show("При регистрации пользоватедля возникла ошибка!");
}
}
}
///////////////////////////////////////////////////////////////////////////////////////// Список товаров
/////////////////////////////////////////////////////////////////////////////////////////xaml
/////////////////////////////////////////////////////////////////////////////////////////c#
public partial class ListProducts : Page
{
public ListProducts()
{
InitializeComponent();
BtnAdd.Visibility = Visibility.Collapsed;
if (Login.user != null)
{
TBUser.Text = Login.user.UserSurname + " " + Login.user.UserName + " " + Login.user.UserPatronymic;
if (Login.user.Role.RoleName == "Администратор")
{
BtnAdd.Visibility = Visibility.Visible;
}
}
LVProducts.ItemsSource = Base.date.Product.ToList();
TBCountField.Text = Base.date.Product.ToList().Count + " из " + Base.date.Product.ToList().Count;
CBSort.SelectedIndex = 0;
List manufacturers = Base.date.Manufacturers.ToList();
CBFilt.Items.Add("Все производители");
foreach(Manufacturers m in manufacturers)
{
CBFilt.Items.Add(m.ProductManufacturer);
}
CBFilt.SelectedIndex = 0;
}
private void BtnBack_Click(object sender, RoutedEventArgs e)
{
FrameClass.frame.Navigate(new Login());
}
private void TBSearch_TextChanged(object sender, TextChangedEventArgs e)
{
Search();
}
private void CBSort_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Search();
}
private void Search()
{
List products = Base.date.Product.ToList();
if(TBSearch.Text.Length > 0)
{
products = products.Where(x => x.ProductName.ToLower().Contains(TBSearch.Text.ToLower()) || x.ProductDescription.ToLower().Contains(TBSearch.Text.ToLower()) || x.Manufacturers.ProductManufacturer.ToLower().Contains(TBSearch.Text.ToLower())).ToList();
}
switch(CBSort.SelectedIndex)
{
case 1:
products = products.OrderBy(x => x.ProductCost).ToList();
break;
case 2:
products = products.OrderByDescending(x => x.ProductCost).ToList();
break;
}
if(CBFilt.SelectedIndex > 0)
{
products = products.Where(x => x.Manufacturers.ProductManufacturer == CBFilt.SelectedValue).ToList();
}
LVProducts.ItemsSource = products;
TBCountField.Text = products.Count + " из " + Base.date.Product.ToList().Count;
if(products.Count == 0)
{
MessageBox.Show("Данные не найдены");
}
}
private void BtnDelete_Click(object sender, RoutedEventArgs e)
{
Button button = sender as Button;
int index = Convert.ToInt32(button.Uid);
if(Base.date.OrderProduct.Where(x => x.ProductID == index).ToList().Count == 0)
{
if(MessageBox.Show("Вы точно хотите удалить товар?", "Системное сообщение", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
{
try
{
Product product = Base.date.Product.FirstOrDefault(x => x.ProductID == index);
Base.date.Product.Remove(product);
Base.date.SaveChanges();
LVProducts.ItemsSource = Base.date.Product.ToList();
TBCountField.Text = Base.date.Product.ToList().Count + " из " + Base.date.Product.ToList().Count;
MessageBox.Show("Товар успешно удален");
}
catch
{
MessageBox.Show("При удаление товара возникла ошибка!");
}
}
}
else
{
MessageBox.Show("Товар нельзя удалить так как с ним есть заказ");
}
}
private void BtnUpdate_Click(object sender, RoutedEventArgs e)
{
Button button = sender as Button;
int index = Convert.ToInt32(button.Uid);
Product product = Base.date.Product.FirstOrDefault( x => x.ProductID == index);
FrameClass.frame.Navigate(new AddAndUpdate(product));
}
private void BtnAdd_Click(object sender, RoutedEventArgs e)
{
FrameClass.frame.Navigate(new AddAndUpdate());
}
private void BtnDelete_Loaded(object sender, RoutedEventArgs e)
{
Button button = sender as Button;
button.Visibility = Visibility.Collapsed;
if(Login.user != null)
{
if(Login.user.Role.RoleName == "Администратор")
{
button.Visibility = Visibility.Visible;
}
}
}
private void BtnUpdate_Loaded(object sender, RoutedEventArgs e)
{
Button button = sender as Button;
button.Visibility = Visibility.Collapsed;
if (Login.user != null)
{
if (Login.user.Role.RoleName == "Администратор")
{
button.Visibility = Visibility.Visible;
}
}
}
}
///////////////////////////////////////////////////////////////////////////////////////// Редактирование
///////////////////////////////////////////////////////////////////////////////////////// xaml
///////////////////////////////////////////////////////////////////////////////////////// C#
public partial class AddAndUpdate : Page
{
Product product;
bool newProduct;
string image;
public AddAndUpdate()
{
InitializeComponent();
newProduct = true;
BtnAddAndUpdate.Content = "Добавть";
TBHeader.Text = "Добавление продукта";
image = "\\resources\\picture.png";
IMPhoto.Source = new BitmapImage(new Uri(image, UriKind.Relative));
BtnUpdPhoto.Content = "Добавить";
CreateField();
}
public AddAndUpdate(Product product)
{
InitializeComponent();
newProduct = false;
this.product = product;
BtnAddAndUpdate.Content = "Изменить";
TBHeader.Text = "Изменение продукта";
SPID.Visibility = Visibility.Visible;
TBID.Text = product.ProductID.ToString();
CreateField();
if(product.ProductPhoto != null)
{
image = product.ProductPhoto;
IMPhoto.Source = new BitmapImage(new Uri(Directory.GetParent(Environment.CurrentDirectory).Parent.FullName + image));
BtnUpdPhoto.Content = "Изменить";
}
else
{
image = "\\resources\\picture.png";
IMPhoto.Source = new BitmapImage(new Uri(image, UriKind.Relative));
BtnUpdPhoto.Content = "Добавить";
}
TBName.Text = product.ProductName;
TBDescription.Text = product.ProductDescription;
CBCategoria.SelectedIndex = product.Categorys.ProductCategoryID - 1;
CBUnit.SelectedIndex = product.Units.ProductUnitID - 1;
CBSuplier.SelectedIndex = product.Supliers.ProductSuplierID - 1;
TBCountInSclad.Text = product.ProductQuantityInStock.ToString();
TBCost.Text = product.ProductCost.ToString();
}
private void CreateField()
{
CBCategoria.ItemsSource = Base.date.Categorys.ToList();
CBCategoria.SelectedValuePath = "ProductCategoryID";
CBCategoria.DisplayMemberPath = "ProductCategory";
CBUnit.ItemsSource = Base.date.Units.ToList();
CBUnit.SelectedValuePath = "ProductUnitID";
CBUnit.DisplayMemberPath = "ProductUnit";
CBSuplier.ItemsSource = Base.date.Supliers.ToList();
CBSuplier.SelectedValuePath = "ProductSuplierID";
CBSuplier.DisplayMemberPath = "ProductSuplier";
}
private void BtnBack_Click(object sender, RoutedEventArgs e)
{
FrameClass.frame.Navigate(new ListProducts());
}
private void BtnAddAndUpdate_Click(object sender, RoutedEventArgs e)
{
try
{
if (newProduct)
{
product = new Product();
product.ProductID = Base.date.Product.Max(x => x.ProductID) + 1;
}
product.ProductName = TBName.Text;
product.ProductCategoryID = CBCategoria.SelectedIndex + 1;
product.ProductUnitID = CBUnit.SelectedIndex + 1;
product.ProductSuplierID = CBSuplier.SelectedIndex + 1;
product.ProductQuantityInStock = Convert.ToInt32(TBCountInSclad.Text);
product.ProductCost = Convert.ToDouble(TBCost.Text);
product.ProductDescription = TBDescription.Text;
if (image == "\\resources\\picture.png")
{
product.ProductPhoto = null;
}
else
{
product.ProductPhoto = image;
}
if(newProduct)
{
Base.date.Product.Add(product);
}
Base.date.SaveChanges();
if (newProduct)
{
MessageBox.Show("Товар успешно добавлен");
}
else
{
MessageBox.Show("Товар успешно изменен");
}
FrameClass.frame.Navigate(new ListProducts());
}
catch
{
if(newProduct)
{
MessageBox.Show("При добавление товара возникла ошибка");
}
else
{
MessageBox.Show("При изменение товара возникла ошибка");
}
}
}
private void TBCountInSclad_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
if(!(Char.IsDigit(e.Text, 0)))
{
e.Handled = true;
}
}
private void TBCost_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
if (!(Char.IsDigit(e.Text, 0)) && (e.Text != ","))
{
e.Handled = true;
}
}
private void BtnDeletePhoto_Click(object sender, RoutedEventArgs e)
{
image = "\\resources\\picture.png";
IMPhoto.Source = new BitmapImage(new Uri(image, UriKind.Relative));
BtnUpdPhoto.Content = "Добавить";
}
private void BtnUpdPhoto_Click(object sender, RoutedEventArgs e)
{
try
{
string path;
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.ShowDialog();
path = openFileDialog.FileName;
if(path != null)
{
string newFilePath = Directory.GetParent(Environment.CurrentDirectory).Parent.FullName + "\\image\\" + System.IO.Path.GetFileName(path); // Путь куда копировать файл
if (!File.Exists(newFilePath)) // Проверка наличия картинки в папке
{
File.Copy(path, newFilePath);
}
image = "\\image\\" + System.IO.Path.GetFileName(path);
IMPhoto.Source = new BitmapImage(new Uri(Directory.GetParent(Environment.CurrentDirectory).Parent.FullName + image));
BtnUpdPhoto.Content = "Изменить";
}
}
catch
{
MessageBox.Show("При добавлении нового фото возникла ошибка!");
}
}
}
///////////////////////////////////////////////////////////////////////////////////////// Частичный класс
public string HaveInSclad
{
get
{
if(ProductQuantityInStock > 0)
{
return "Товар есть на складе";
}
return "Товар отсутствует";
}
}
public SolidColorBrush BackgroundColor
{
get
{
if (ProductQuantityInStock > 0)
{
return Brushes.White;
}
return Brushes.Gray;
}
}
public string ImageAbsolute
{
get
{
if(ProductPhoto == null)
{
return null;
}
else
{
return Directory.GetParent(Environment.CurrentDirectory).Parent.FullName + ProductPhoto;
}
}
}
///////////////////////////////////////////////////////////////////////////////////////// Прочее
DateTime dateTime = new DateTime();
Console.WriteLine(dateTime); // 01.01.0001 0:00:00
Console.WriteLine(DateTime.Now); // Текущая дата и время
Console.WriteLine(DateTime.Today);
DateTime date1 = new DateTime(2015, 7, 20, 18, 30, 25); // 20.07.2015 18:30:25
Console.WriteLine(date1.AddHours(-3)); // 20.07.2015 15:30:25
public TimeSpan (int hours, int minutes, int seconds);
TimeSpan.FromDays(10) - TimeSpan.FromSeconds(1); // 9.23:59:59
Regex regex = new Regex("(?=.*[0-9].*[0-9])(?=.*[a-zA-Z])(?=.*[!@#$&*])^(.{4,6})$"); // Регулярное выражение для проверки пароля (минимум 2 цифры, 1 латинская буква и один спец символ (символов от 4 до 6))
Regex regex = new Regex("((?= ^[8])(.{ 11}$))| (?= ^\\+? (7))(.{ 12})$"); // Регулярное выражение для телефона