Алёна Плотникова 3 lat temu
rodzic
commit
364ce035c4

+ 6 - 0
UnitTestProject1/App.config

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <connectionStrings>
+    <add name="DefaultConnection" connectionString="Data Source=LAPTOP-306C0BCK\SQLEXPRESS;Initial Catalog=OpenSky;Integrated Security=True" providerName="System.Data.SqlClient" />
+  </connectionStrings>
+</configuration>

+ 20 - 0
UnitTestProject1/Properties/AssemblyInfo.cs

@@ -0,0 +1,20 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+[assembly: AssemblyTitle("UnitTestProject1")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("UnitTestProject1")]
+[assembly: AssemblyCopyright("Copyright ©  2021")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+[assembly: ComVisible(false)]
+
+[assembly: Guid("417a9e8d-3edc-4043-b3de-6332c907aa07")]
+
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

+ 61 - 0
UnitTestProject1/UnitTest1.cs

@@ -0,0 +1,61 @@
+using System;
+using kursach.Windows;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace UnitTestProject1
+{
+    [TestClass]
+    public class UnitTest1
+    {
+        [TestMethod]
+        public void TestAuth()
+        {
+            var page = new Auth();
+
+            Assert.IsTrue(page.testauth("gr692_pav", "plo030803a"));
+            Assert.IsTrue(page.testauth("test1", "qwerty"));
+            Assert.IsTrue(page.testauth("hehehelp", "hehehe"));
+
+            Assert.IsFalse(page.testauth("", ""));
+            Assert.IsFalse(page.testauth("test1", ""));
+            Assert.IsFalse(page.testauth("", "hehehe"));
+            Assert.IsFalse(page.testauth("dsvdvd", "dfvfdfv"));
+            Assert.IsFalse(page.testauth("plo030803a", "gr692_pav"));
+        }
+
+        [TestMethod]
+        public void TestReg()
+        {
+            var page = new Reg();
+
+            Assert.IsTrue(page.testreg("Кашлач", "Никита", "Сергеевич", "nikich4523", "nikich4523", "nikich4523"));
+
+            Assert.IsFalse(page.testreg("", "", "", "", "", ""));
+            Assert.IsFalse(page.testreg("", "Никита", "Сергеевич", "nikich4523", "nikich4523", "nikich4523"));
+            Assert.IsFalse(page.testreg("Кашлач", "", "Сергеевич", "nikich4523", "nikich4523", "nikich4523"));
+            Assert.IsFalse(page.testreg("Кашлач", "Никита", "", "nikich4523", "nikich4523", "nikich4523"));
+            Assert.IsFalse(page.testreg("Кашлач", "Никита", "Сергеевич", "", "nikich4523", "nikich4523"));
+            Assert.IsFalse(page.testreg("Кашлач", "Никита", "Сергеевич", "nikich4523", "", "nikich4523"));
+            Assert.IsFalse(page.testreg("Кашлач", "Никита", "Сергеевич", "nikich4523", "nikich4523", ""));
+            Assert.IsFalse(page.testreg("Кашлач", "Никита", "Сергеевич", "test1", "nikich4523", "nikich4523"));
+            Assert.IsFalse(page.testreg("Кашлач", "Никита", "Сергеевич", "nikich4523", "nikich4523", "nikich"));
+            Assert.IsFalse(page.testreg("Кашлач", "Никита", "Сергеевич", "4523", "nikich4523", "nikich4523"));
+            Assert.IsFalse(page.testreg("Кашлач", "Никита", "Сергеевич", "nikich4523", "4523", "4523"));
+        }
+
+        [TestMethod]
+        public void TestAcc()
+        {
+            var page = new Account(1);
+            string Exp, Res;
+
+            Exp = "Плотникова Алёна Владимировна";
+            Res = page.testaccLFM();
+            Assert.AreEqual(Exp, Res);
+
+            Exp = "gr692_pav";
+            Res = page.testaccLogin();
+            Assert.AreEqual(Exp, Res);
+        }
+    }
+}

+ 78 - 0
UnitTestProject1/UnitTestProject1.csproj

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.props" Condition="Exists('..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.props')" />
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{417A9E8D-3EDC-4043-B3DE-6332C907AA07}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>UnitTestProject1</RootNamespace>
+    <AssemblyName>UnitTestProject1</AssemblyName>
+    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion>
+    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
+    <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages</ReferencePath>
+    <IsCodedUITest>False</IsCodedUITest>
+    <TestProjectType>UnitTest</TestProjectType>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\MSTest.TestFramework.2.1.1\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>..\packages\MSTest.TestFramework.2.1.1\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll</HintPath>
+    </Reference>
+    <Reference Include="PresentationCore" />
+    <Reference Include="PresentationFramework" />
+    <Reference Include="System" />
+    <Reference Include="System.Core" />
+    <Reference Include="WindowsBase" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="UnitTest1.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+    <None Include="packages.config" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\kursach\kursach.csproj">
+      <Project>{6a9b7aa6-4d1a-4828-8174-f20ce17effb7}</Project>
+      <Name>kursach</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>Данный проект ссылается на пакеты NuGet, отсутствующие на этом компьютере. Используйте восстановление пакетов NuGet, чтобы скачать их.  Дополнительную информацию см. по адресу: http://go.microsoft.com/fwlink/?LinkID=322105. Отсутствует следующий файл: {0}.</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.props'))" />
+    <Error Condition="!Exists('..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.targets'))" />
+  </Target>
+  <Import Project="..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.targets" Condition="Exists('..\packages\MSTest.TestAdapter.2.1.1\build\net45\MSTest.TestAdapter.targets')" />
+</Project>

+ 5 - 0
UnitTestProject1/packages.config

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="MSTest.TestAdapter" version="2.1.1" targetFramework="net472" />
+  <package id="MSTest.TestFramework" version="2.1.1" targetFramework="net472" />
+</packages>

+ 6 - 0
kursach.sln

@@ -5,6 +5,8 @@ VisualStudioVersion = 16.0.30503.244
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "kursach", "kursach\kursach.csproj", "{6A9B7AA6-4D1A-4828-8174-F20CE17EFFB7}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTestProject1", "UnitTestProject1\UnitTestProject1.csproj", "{417A9E8D-3EDC-4043-B3DE-6332C907AA07}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -15,6 +17,10 @@ Global
 		{6A9B7AA6-4D1A-4828-8174-F20CE17EFFB7}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{6A9B7AA6-4D1A-4828-8174-F20CE17EFFB7}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{6A9B7AA6-4D1A-4828-8174-F20CE17EFFB7}.Release|Any CPU.Build.0 = Release|Any CPU
+		{417A9E8D-3EDC-4043-B3DE-6332C907AA07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{417A9E8D-3EDC-4043-B3DE-6332C907AA07}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{417A9E8D-3EDC-4043-B3DE-6332C907AA07}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{417A9E8D-3EDC-4043-B3DE-6332C907AA07}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE

+ 8 - 0
kursach/App.config

@@ -6,4 +6,12 @@
   <connectionStrings>
     <add name="DefaultConnection" connectionString="Data Source=LAPTOP-306C0BCK\SQLEXPRESS;Initial Catalog=OpenSky;Integrated Security=True" providerName="System.Data.SqlClient" />
   </connectionStrings>
+  <runtime>
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <dependentAssembly>
+        <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
 </configuration>

+ 2 - 1
kursach/MainWindow.xaml.cs

@@ -13,6 +13,7 @@ using System.Windows.Media.Imaging;
 using System.Windows.Navigation;
 using System.Windows.Shapes;
 
+
 namespace kursach
 {
     /// <summary>
@@ -23,7 +24,7 @@ namespace kursach
         public MainWindow()
         {
             InitializeComponent();
-        }
+        }      
 
         private void Image_MouseDown(object sender, MouseButtonEventArgs e)
         {

+ 52 - 2
kursach/Windows/Account.xaml.cs

@@ -22,6 +22,8 @@ namespace kursach.Windows
     /// </summary>
     public partial class Account : Window
     {
+        public static int UserId = 0;
+
         string connectionString;
         SqlDataAdapter adapter = new SqlDataAdapter();
         DataTable usersTable = new DataTable();
@@ -51,6 +53,52 @@ namespace kursach.Windows
             connection.Close();
         }
 
+        //для теста
+        public string testaccLFM()
+        {
+            usersTable.Clear();
+
+            SqlConnection connection = new SqlConnection(connectionString);
+            connection.Open();
+
+            SqlCommand command = new SqlCommand();
+            command.CommandText = "SELECT CONCAT(LastName, ' ', FirstName, ' ', MiddleName), Login, Image FROM Users WHERE IdUser = 1";
+            command.Connection = connection;
+
+            adapter.SelectCommand = command;
+            adapter.Fill(usersTable);
+
+            string LFM;
+            LFM = usersTable.Rows[0][0].ToString();
+
+            connection.Close();
+
+            return LFM;
+        }
+
+        public string testaccLogin()
+        {
+            usersTable.Clear();
+
+            SqlConnection connection = new SqlConnection(connectionString);
+            connection.Open();
+
+            SqlCommand command = new SqlCommand();
+            command.CommandText = "SELECT CONCAT(LastName, ' ', FirstName, ' ', MiddleName), Login, Image FROM Users WHERE IdUser = 1";
+            command.Connection = connection;
+
+            adapter.SelectCommand = command;
+            adapter.Fill(usersTable);
+
+            string log;
+            log = usersTable.Rows[0][1].ToString();
+
+            connection.Close();
+
+            return log;
+        }
+        //
+
         string filename;
 
         private void AlterImage(object sender, RoutedEventArgs e)
@@ -59,7 +107,7 @@ namespace kursach.Windows
             Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
 
             dlg.DefaultExt = ".png";
-            dlg.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif";
+            dlg.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg";
 
             Nullable<bool> result = dlg.ShowDialog();
 
@@ -99,7 +147,9 @@ namespace kursach.Windows
         private void Like(object sender, MouseButtonEventArgs e)
         {
             //переход в избранное
-
+            Windows.Fav fav = new Windows.Fav(UserId);
+            fav.Show();
+            Close();
         }
 
         private void Exit(object sender, MouseButtonEventArgs e)

+ 39 - 3
kursach/Windows/Auth.xaml.cs

@@ -37,9 +37,7 @@ namespace kursach.Windows
         {
             //вернуться назад
             MainWindow main = new MainWindow();
-            main.Show();
-            Windows.Menu menu = new Windows.Menu();
-            menu.ShowDialog();            
+            main.Show();           
             Close();
         }
 
@@ -53,6 +51,8 @@ namespace kursach.Windows
 
         private void auth(object sender, RoutedEventArgs e)
         {
+            testauth(login.Text, password.Password);
+
             //обработчик ошибок при авторизации
             if(login.Text == "" || password.Password == "")
             {
@@ -87,5 +87,41 @@ namespace kursach.Windows
 
             connection.Close();
         }
+
+        ////для теста
+        public bool testauth(string log, string pass)
+        {
+            usersTable.Clear();
+
+            if (log == "" || pass == "")
+            {
+                //неуспех
+                return false;
+            }
+
+            SqlConnection connection = new SqlConnection(connectionString);
+            connection.Open();
+
+            SqlCommand command = new SqlCommand();
+            command.CommandText = "SELECT * FROM Users WHERE Login = '" + log + "' AND Password = '" + pass + "'";
+            command.Connection = connection;
+
+            adapter.SelectCommand = command;
+            adapter.Fill(usersTable);
+
+            if (usersTable.Rows.Count != 0)
+            {
+                //успех
+                connection.Close();
+                return true;
+
+            }
+            else
+            {
+                //неуспех
+                connection.Close();
+                return false;
+            }
+        }
     }
 }

+ 38 - 0
kursach/Windows/Fav.xaml

@@ -0,0 +1,38 @@
+<Window x:Class="kursach.Windows.Fav"
+        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:kursach.Windows"
+        mc:Ignorable="d"
+        Title="Favourites" Height="450" Width="800" MinHeight="450" MinWidth="800" Icon="/kursach;component/Image/aircraft.png" WindowStartupLocation="CenterScreen" >
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="0.2*"/>
+            <RowDefinition Height="0.1*"/>
+            <RowDefinition Height="*"/>
+            <RowDefinition Height="0.15*"/>
+        </Grid.RowDefinitions>
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="0.45*"/>
+            <ColumnDefinition Width="*"/>
+        </Grid.ColumnDefinitions>
+        <Rectangle Fill="#abcdef" Margin="0, 0, 0, 0" Grid.ColumnSpan="2"/>
+        <Label Content="Избранное" Margin="10,5" FontFamily="/kursach;component/Fonts/#Montserrat Medium" FontSize="36"/>
+        <Button Content="Назад" Click="Back" Margin="10" Grid.Row="3" FontFamily="/kursach;component/Fonts/#Montserrat Medium" FontSize="16"/>
+        <DataGrid x:Name="planeGrid" Grid.Row="2" Grid.ColumnSpan="2" AutoGenerateColumns="False">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Позывной" Binding="{Binding Callsign}" Width="*"/>
+                <DataGridTextColumn Header="Долгота" Binding="{Binding Longitude}" Width="*"/>
+                <DataGridTextColumn Header="Широта" Binding="{Binding Latitude}" Width="*"/>
+                <DataGridTextColumn Header="Страна (eng)" Binding="{Binding Country}" Width="*"/>
+                <DataGridTextColumn Header="Высота (м)" Binding="{Binding Altitude}" Width="*"/>
+                <DataGridTextColumn Header="Скорость (км/ч)" Binding="{Binding Velocity}" Width="*"/>
+                <DataGridTextColumn Header="Земля" Binding="{Binding On_ground}" Width="*"/>
+            </DataGrid.Columns>
+        </DataGrid>
+        <Button Click="Upd" Content="Обновить данные"  Grid.Column="0" Grid.Row="1" FontFamily="/kursach;component/Fonts/#Montserrat Medium" FontSize="14" />
+        <TextBlock Grid.Column="1" Grid.Row="1" Margin="10,5" Text="*если строка пуста, значит в данный момент датчики отключены и информация недоступна"/>
+        <Button Click="Delete" Grid.Column="1" Grid.Row="3" Margin="300, 10, 10, 10" Content="Удалить из избранного" FontFamily="/kursach;component/Fonts/#Montserrat Medium" FontSize="14"/>
+    </Grid>
+</Window>

+ 196 - 0
kursach/Windows/Fav.xaml.cs

@@ -0,0 +1,196 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+using System.IO;
+using System.Net;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System.Text.RegularExpressions;
+using System.Data.SqlClient;
+using System.Data;
+using System.Configuration;
+
+namespace kursach.Windows
+{
+    /// <summary>
+    /// Логика взаимодействия для Fav.xaml
+    /// </summary>
+    public partial class Fav : Window
+    {
+        string connectionString;
+        SqlDataAdapter adapter = new SqlDataAdapter();
+        DataTable usersTable = new DataTable();
+
+        List<Plane> planeList = new List<Plane>();
+        public Fav(int IdUser)
+        {
+            InitializeComponent();
+
+            //получаем строку подключения из app.config
+            connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
+
+            SqlConnection connection = new SqlConnection(connectionString);
+            connection.Open();
+
+            SqlCommand command = new SqlCommand();
+            command.CommandText = "SELECT Icao24 FROM Favourites WHERE IdUser = " + Menu.UserId;
+            command.Connection = connection;
+
+            adapter.SelectCommand = command;
+            adapter.Fill(usersTable);
+
+            try
+            {
+                foreach (DataRow dr in usersTable.Rows)
+                {
+                    string answer = Connect("https://opensky-network.org/api/states/all?icao24=" + dr[0]);
+                    planeList.Add(GetPlane(answer));
+                }
+                planeGrid.ItemsSource = planeList;
+            }
+            catch
+            {
+                MessageBox.Show("Проблемы с подключением...");
+            }
+            connection.Close();
+        }
+
+        //подключение к api
+        public string Connect(string apiUrl)
+        {
+            WebRequest request = WebRequest.Create(apiUrl);
+            request.Method = "GET";
+            WebResponse response = request.GetResponse();
+            string answer = string.Empty;
+            using (Stream s = response.GetResponseStream())
+            {
+                using (StreamReader reader = new StreamReader(response.GetResponseStream()))
+                {
+                    answer = reader.ReadToEnd();
+                }
+            }
+            response.Close();
+            return answer;
+        }
+
+        //заполнение таблицы
+        public Plane GetPlane(string answer)
+        {
+            Plane plane = new Plane();
+
+            JObject answerJson = JObject.Parse(answer);
+
+            // get JSON result objects into a list
+            IList<JToken> results = answerJson["states"].Children().ToList();
+
+            // serialize JSON results into .NET objects            
+            foreach (JToken result in results)
+            {
+                List<string> resultString = result.ToString().TrimStart('[').TrimEnd(']').Split(',').ToList<string>();
+                plane.Icao24 = resultString[0].Trim();
+                plane.Callsign = resultString[1].Trim().TrimStart('"').TrimEnd('"');
+                plane.Country = resultString[2].Trim().TrimStart('"').TrimEnd('"');
+                plane.Longitude = resultString[5].Trim();
+                plane.Latitude = resultString[6].Trim();
+                plane.On_ground = resultString[8].Trim();
+                plane.Velocity = resultString[9].Trim();
+                plane.Altitude = resultString[13].Trim();
+            }
+
+            return plane;
+        }
+
+        //возвращение к предыдущему окну
+        private void Back(object sender, RoutedEventArgs e)
+        {
+            //вернуться назад
+            Windows.Account acc = new Windows.Account(Menu.UserId);
+            acc.Show();
+            Close();
+        }
+
+        //удаление строки из избранного
+        private void Delete(object sender, RoutedEventArgs e)
+        {
+            if (planeGrid.SelectedItem != null)
+            {
+                Plane plane = (Plane)planeGrid.SelectedItem;
+
+                if(string.IsNullOrEmpty(plane.Icao24))
+                {
+                    MessageBox.Show("Не удаётся удалить, повторите попытку позже");
+                    return;
+                }
+
+                SqlConnection connection = new SqlConnection(connectionString);
+                connection.Open();
+
+                SqlCommand command = new SqlCommand();
+                command.CommandText = "DELETE Favourites WHERE IdUser = " + Menu.UserId + " AND Icao24 = '" + plane.Icao24.Trim('"') + "'";
+                command.Connection = connection;
+                command.ExecuteNonQuery();
+
+                connection.Close();
+
+                Fun();
+                
+            }
+            else
+            {
+                MessageBox.Show("Нет выделенной строки");
+            }
+        }
+
+        //кнопка обновление
+        private void Upd(object sender, RoutedEventArgs e)
+        {
+            Fun();
+        }
+
+        //функция обновление
+        private void Fun()
+        {
+            try
+            {
+                planeGrid.ItemsSource = new List<int>();
+                planeList.Clear();
+                usersTable.Clear();
+
+                //получаем строку подключения из app.config
+                connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
+
+                SqlConnection connection = new SqlConnection(connectionString);
+                connection.Open();
+
+                SqlCommand command = new SqlCommand();
+                command.CommandText = "SELECT Icao24 FROM Favourites WHERE IdUser = " + Menu.UserId;
+                command.Connection = connection;
+
+                adapter.SelectCommand = command;
+                adapter.Fill(usersTable);
+
+                foreach (DataRow dr in usersTable.Rows)
+                {
+                    string answer = Connect("https://opensky-network.org/api/states/all?icao24=" + dr[0]);
+                    planeList.Add(GetPlane(answer));
+                }
+                planeGrid.ItemsSource = planeList;
+                connection.Close();
+            }
+            catch
+            {
+                MessageBox.Show("Проблемы с подключением...");
+            }
+        }
+    }
+}

+ 35 - 3
kursach/Windows/Menu.xaml.cs

@@ -39,21 +39,53 @@ namespace kursach.Windows
                 MessageBox.Show("Вы уже вошли, переходим в профиль...");
                 Windows.Account acc = new Windows.Account(UserId);
                 acc.Show();
-                Close();
+                
+                foreach(var wnd in Application.Current.Windows)
+                {
+                    if (wnd is MainWindow)
+                    {
+                        MainWindow boofWnd = (MainWindow)wnd;
+                        boofWnd.Close();
+                    }
+                }
+
+                Close();               
             }
             else
             {
                 //перейти к авторизации
                 Windows.Auth auth = new Windows.Auth();
                 auth.Show();
-                Close();
-                Application.Current.MainWindow.Close();
+
+                foreach (var wnd in Application.Current.Windows)
+                {
+                    if (wnd is MainWindow)
+                    {
+                        MainWindow boofWnd = (MainWindow)wnd;
+                        boofWnd.Close();
+                    }
+                }
+
+                Close();                
             }             
         }
 
         private void Search(object sender, RoutedEventArgs e)
         {
             //перейти к поиску
+            Windows.Search search = new Windows.Search();
+            search.Show();
+
+            foreach (var wnd in Application.Current.Windows)
+            {
+                if (wnd is MainWindow)
+                {
+                    MainWindow boofWnd = (MainWindow)wnd;
+                    boofWnd.Close();
+                }
+            }
+
+            Close();
         }
     }
 }

+ 44 - 0
kursach/Windows/Reg.xaml.cs

@@ -104,5 +104,49 @@ namespace kursach.Windows
 
             connection.Close();
         }
+
+        //для теста
+        public bool testreg(string LName, string FName, string MName, string log, string pass1, string pass2)
+        {
+            usersTable.Clear();
+
+            //обработчик ошибок при регистрации
+            if (LName == "" || FName == "" || MName == "" || log == "" || pass1 == "" || pass2 == "")
+            {
+                return false;
+            }
+
+            if (log.Length < 5 || pass1.Length < 5)
+            {
+                return false;
+            }
+
+            if (pass1 != pass2)
+            {
+                return false;
+            }
+
+            SqlConnection connection = new SqlConnection(connectionString);
+            connection.Open();
+
+            SqlCommand command = new SqlCommand();
+            command.CommandText = "SELECT * FROM Users WHERE Login = '" + log + "'";
+            command.Connection = connection;
+
+            adapter.SelectCommand = command;
+            adapter.Fill(usersTable);
+
+            if (usersTable.Rows.Count != 0)
+            {
+                connection.Close();
+                return false;
+            }
+            else
+            {
+                //успех, переход в профиль
+                connection.Close();
+                return true;
+            } 
+        }
     }
 }

+ 41 - 0
kursach/Windows/Search.xaml

@@ -0,0 +1,41 @@
+<Window x:Class="kursach.Windows.Search"
+        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:kursach.Windows"
+        mc:Ignorable="d"
+        Title="Search" Height="450" Width="800" MinHeight="450" MinWidth="800" Icon="/kursach;component/Image/aircraft.png" WindowStartupLocation="CenterScreen">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="0.2*"/>
+            <RowDefinition Height="0.1*"/>
+            <RowDefinition Height="*"/>
+            <RowDefinition Height="0.15*"/>
+        </Grid.RowDefinitions>
+        <Grid.ColumnDefinitions>
+            <ColumnDefinition Width="0.25*"/>
+            <ColumnDefinition Width="*"/>
+        </Grid.ColumnDefinitions>
+        <Rectangle Fill="#abcdef" Margin="0, 0, 0, 0" Grid.ColumnSpan="2"/>
+        <Label Content="Поиск" Margin="10,5" FontFamily="/kursach;component/Fonts/#Montserrat Medium" FontSize="36"/>
+        <Button Content="Назад" Click="Back" Margin="10" Grid.Row="3" FontFamily="/kursach;component/Fonts/#Montserrat Medium" FontSize="16"/>
+        <DataGrid x:Name="planeGrid" Grid.Row="2" Grid.ColumnSpan="2" AutoGenerateColumns="False">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="Позывной" Binding="{Binding Callsign}" Width="*"/>
+                <DataGridTextColumn Header="Долгота" Binding="{Binding Longitude}" Width="*"/>
+                <DataGridTextColumn Header="Широта" Binding="{Binding Latitude}" Width="*"/>
+                <DataGridTextColumn Header="Страна (eng)" Binding="{Binding Country}" Width="*"/>
+                <DataGridTextColumn Header="Высота (м)" Binding="{Binding Altitude}" Width="*"/>
+                <DataGridTextColumn Header="Скорость (км/ч)" Binding="{Binding Velocity}" Width="*"/>
+                <DataGridTextColumn Header="Земля" Binding="{Binding On_ground}" Width="*"/>
+            </DataGrid.Columns>
+        </DataGrid>
+        <TextBox x:Name="SearchCallsign" Grid.Column="1" Margin="10,22,360,10" TextWrapping="Wrap" Text="Введите позывной" VerticalContentAlignment="Center" FontFamily="/kursach;component/Fonts/#Montserrat Medium" Foreground="#FF5D5656"/>
+        <TextBox x:Name="SearchCountry" Grid.Column="1" Margin="279,22,91,10" TextWrapping="Wrap" Text="Введите страну" VerticalContentAlignment="Center" FontFamily="/kursach;component/Fonts/#Montserrat Medium" Foreground="#FF5D5656"/>
+        <Button Click="Find" Grid.Column="1" Margin="548,22,10,10" Content="Найти" FontFamily="/kursach;component/Fonts/#Montserrat Medium" />
+        <TextBlock Grid.Column="1" Grid.Row="1" Margin="10,5" Text="*если хотите осуществить поиск только по одному полю, то оставьте второе пустым. чувствителен к регистру"/>
+        <Button Click="Upd" Content="Обновить данные"  Grid.Column="0" Grid.Row="1" FontFamily="/kursach;component/Fonts/#Montserrat Medium" FontSize="14" />
+        <Button Click="Fav" Content="Добавить в избранное" Margin="400,10,10,10" Grid.Row="3" FontFamily="/kursach;component/Fonts/#Montserrat Medium" FontSize="16" Grid.Column="1"/>
+    </Grid>
+</Window>

+ 193 - 0
kursach/Windows/Search.xaml.cs

@@ -0,0 +1,193 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+using System.IO;
+using System.Net;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System.Text.RegularExpressions;
+using System.Data.SqlClient;
+using System.Data;
+using System.Configuration;
+
+namespace kursach.Windows
+{
+    /// <summary>
+    /// Логика взаимодействия для Search.xaml
+    /// </summary>
+    public partial class Search : Window
+    {
+        string connectionString;
+        SqlDataAdapter adapter = new SqlDataAdapter();
+        DataTable usersTable = new DataTable();
+
+        public Search()
+        {
+            InitializeComponent();
+
+            try
+            {
+                string answer = Connect("https://opensky-network.org/api/states/all");
+                planeGrid.ItemsSource = GetPlaneList(answer);
+            }
+            catch
+            {
+                MessageBox.Show("Проблемы с подключением...");
+            }
+
+            //получаем строку подключения из app.config
+            connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
+        }
+
+        //подключение к api
+        public string Connect(string apiUrl)
+        {
+            WebRequest request = WebRequest.Create(apiUrl);
+            request.Method = "GET";
+            WebResponse response = request.GetResponse();
+            string answer = string.Empty;
+            using (Stream s = response.GetResponseStream())
+            {
+                using (StreamReader reader = new StreamReader(response.GetResponseStream()))
+                {
+                    answer = reader.ReadToEnd();
+                }
+            }
+            response.Close();
+            return answer;
+        }
+
+        List<Plane> planeList = new List<Plane>();
+        List<Plane> subPlaneList = new List<Plane>();
+
+        //заполнение основного листа
+        public List<Plane> GetPlaneList(string answer)
+        {
+            JObject answerJson = JObject.Parse(answer);
+
+            IList<JToken> results = answerJson["states"].Children().ToList();
+          
+            foreach (JToken result in results)
+            {
+                List<string> resultString = result.ToString().TrimStart('[').TrimEnd(']').Split(',').ToList<string>();
+                Plane plane = new Plane();
+                plane.Icao24 = resultString[0].Trim().TrimStart('"').TrimEnd('"');
+                plane.Callsign = resultString[1].Trim().TrimStart('"').TrimEnd('"');
+                plane.Country = resultString[2].Trim().TrimStart('"').TrimEnd('"');
+                plane.Longitude = resultString[5].Trim();
+                plane.Latitude = resultString[6].Trim();
+                plane.On_ground = resultString[8].Trim();
+                plane.Velocity = resultString[9].Trim();
+                plane.Altitude = resultString[13].Trim();
+
+                planeList.Add(plane);
+            }
+
+            return planeList;
+        }
+
+        //возврат к предыдущему окну
+        private void Back(object sender, RoutedEventArgs e)
+        {
+            //вернуться назад
+            MainWindow main = new MainWindow();
+            main.Show();
+            Close();
+        }
+
+        //поиск
+        private void Find(object sender, RoutedEventArgs e)
+        {
+            planeGrid.ItemsSource = new List<Plane>();
+            subPlaneList.Clear();
+
+            Regex regex1 = new Regex(@"(\w*)" + SearchCountry.Text + @"(\w*)");
+            Regex regex2 = new Regex(@"(\w*)" + SearchCallsign.Text + @"(\w*)");
+            foreach (Plane plane in planeList)
+            {
+                if (regex1.IsMatch(plane.Country) && SearchCallsign.Text == "")
+                { subPlaneList.Add(plane); }
+
+                if (regex2.IsMatch(plane.Callsign) && SearchCountry.Text == "")
+                { subPlaneList.Add(plane); }
+
+                if (regex1.IsMatch(plane.Country) && regex2.IsMatch(plane.Callsign))
+                { subPlaneList.Add(plane); }
+            }
+
+            planeGrid.ItemsSource = subPlaneList;
+        }
+
+        //добавление в избранное
+        private void Fav(object sender, RoutedEventArgs e)
+        {
+            if (Menu.UserId == 0)
+            {
+                MessageBox.Show("Эта функция доступна только авторизированным пользователям");
+            }
+            else
+            {
+                if(planeGrid.SelectedItem != null)
+                {
+                    Plane plane = (Plane)planeGrid.SelectedItem;
+                    MessageBox.Show(plane.Icao24);
+
+                    SqlConnection connection = new SqlConnection(connectionString);
+                    connection.Open();
+
+                    SqlCommand command = new SqlCommand();
+                    command.CommandText = "INSERT INTO Favourites VALUES(" + Menu.UserId + ", '" + plane.Icao24 + "')";
+                    command.Connection = connection;
+
+                    adapter.SelectCommand = command;
+                    adapter.Fill(usersTable);
+
+                    connection.Close();
+                }
+                else
+                {
+                    MessageBox.Show("Нет выделенной строки");
+                }
+            }
+        }
+
+        //обновление данных
+        private void Upd(object sender, RoutedEventArgs e)
+        {
+            planeGrid.ItemsSource = null;
+            planeList.Clear();
+
+            try
+            {
+                string answer = Connect("https://opensky-network.org/api/states/all");
+                planeGrid.ItemsSource = GetPlaneList(answer);
+            }
+            catch
+            {
+                MessageBox.Show("Проблемы с подключением...");
+            }
+        }
+    }
+
+    public class Plane
+    {
+        public string Icao24 { get; set; }
+        public string Callsign { get; set; }
+        public string Country { get; set; }
+        public string Longitude { get; set; }
+        public string Latitude { get; set; }
+        public string Altitude { get; set; }
+        public string Velocity { get; set; }
+        public string On_ground { get; set; }
+    }
+}

+ 21 - 0
kursach/kursach.csproj

@@ -41,12 +41,18 @@
     <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
       <HintPath>..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll</HintPath>
     </Reference>
+    <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
+    </Reference>
     <Reference Include="System" />
+    <Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" />
     <Reference Include="System.ComponentModel.DataAnnotations" />
     <Reference Include="System.Configuration" />
     <Reference Include="System.Data" />
+    <Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" />
     <Reference Include="System.Runtime.Serialization" />
     <Reference Include="System.Security" />
+    <Reference Include="System.Text.Json, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" />
     <Reference Include="System.Xml" />
     <Reference Include="Microsoft.CSharp" />
     <Reference Include="System.Core" />
@@ -71,12 +77,18 @@
     <Compile Include="Windows\Auth.xaml.cs">
       <DependentUpon>Auth.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Windows\Fav.xaml.cs">
+      <DependentUpon>Fav.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Windows\Menu.xaml.cs">
       <DependentUpon>Menu.xaml</DependentUpon>
     </Compile>
     <Compile Include="Windows\Reg.xaml.cs">
       <DependentUpon>Reg.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Windows\Search.xaml.cs">
+      <DependentUpon>Search.xaml</DependentUpon>
+    </Compile>
     <Page Include="MainWindow.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
@@ -97,6 +109,10 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="Windows\Fav.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="Windows\Menu.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
@@ -105,6 +121,10 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="Windows\Search.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Properties\AssemblyInfo.cs">
@@ -125,6 +145,7 @@
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>
     </EmbeddedResource>
     <Resource Include="Fonts\Montserrat-Medium.ttf" />
+    <None Include="packages.config" />
     <None Include="Properties\Settings.settings">
       <Generator>SettingsSingleFileGenerator</Generator>
       <LastGenOutput>Settings.Designer.cs</LastGenOutput>

+ 4 - 0
kursach/packages.config

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Newtonsoft.Json" version="13.0.1" targetFramework="net472" />
+</packages>