diff --git a/AiSportsMicrospaceDB/AiSportsMicrospaceDB.csproj b/AiSportsMicrospaceDB/AiSportsMicrospaceDB.csproj new file mode 100644 index 0000000..3b09874 --- /dev/null +++ b/AiSportsMicrospaceDB/AiSportsMicrospaceDB.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/AiSportsMicrospaceDB/DBContext/AppDbContext.cs b/AiSportsMicrospaceDB/DBContext/AppDbContext.cs new file mode 100644 index 0000000..ddec24f --- /dev/null +++ b/AiSportsMicrospaceDB/DBContext/AppDbContext.cs @@ -0,0 +1,20 @@ +using AiSportsMicrospaceDB.Entities; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AiSportsMicrospaceDB.DBContext +{ + public class AppDbContext : DbContext + { + public AppDbContext(DbContextOptions options) + : base(options) + { + } + + public DbSet BasicConfig { get; set; } + } +} diff --git a/AiSportsMicrospaceDB/Entities/BasicConfig.cs b/AiSportsMicrospaceDB/Entities/BasicConfig.cs new file mode 100644 index 0000000..5b02428 --- /dev/null +++ b/AiSportsMicrospaceDB/Entities/BasicConfig.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AiSportsMicrospaceDB.Entities +{ + public class BasicConfig + { + // ✅ 主键 + public int Id { get; set; } + public string Host { get; set; } + public string UserName { get; set; } + public string Password { get; set; } + } +} diff --git a/DB/AiSportsMicrospaceDB.db b/DB/AiSportsMicrospaceDB.db new file mode 100644 index 0000000..162a000 Binary files /dev/null and b/DB/AiSportsMicrospaceDB.db differ diff --git a/Wpf_AiSportsMicrospace/App.xaml b/Wpf_AiSportsMicrospace/App.xaml index 61792fe..7e24728 100644 --- a/Wpf_AiSportsMicrospace/App.xaml +++ b/Wpf_AiSportsMicrospace/App.xaml @@ -2,9 +2,9 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:Wpf_AiSportsMicrospace.Views" - xmlns:conv="clr-namespace:Wpf_AiSportsMicrospace.Converter" + xmlns:conv="clr-namespace:Wpf_AiSportsMicrospace.Converter"> - StartupUri="Views/Main.xaml"> + diff --git a/Wpf_AiSportsMicrospace/App.xaml.cs b/Wpf_AiSportsMicrospace/App.xaml.cs index 1a07e67..4fbe65e 100644 --- a/Wpf_AiSportsMicrospace/App.xaml.cs +++ b/Wpf_AiSportsMicrospace/App.xaml.cs @@ -1,8 +1,17 @@ -using System.Configuration; +using AiSportsMicrospaceDB.DBContext; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Microsoft.ML.Runtime; +using System.Configuration; using System.Data; +using System.IO; using System.Windows; using Yztob.AiSports.Common; using Yztob.AiSports.Common.Implement; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Wpf_AiSportsMicrospace.Views; + namespace Wpf_AiSportsMicrospace; @@ -11,16 +20,45 @@ namespace Wpf_AiSportsMicrospace; /// public partial class App : Application { + public static Microsoft.Extensions.Hosting.IHost AppHost { get; private set; } + protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); #if DEBUG - // 初始化 DebugTracker - DebugTracker.Enabled = true; - DebugTracker.Channels.Add(new DiagnosisDebugTrackChannel()); + DebugTracker.Enabled = true; + DebugTracker.Channels.Add(new DiagnosisDebugTrackChannel()); #endif + AppHost = Host.CreateDefaultBuilder() + .ConfigureAppConfiguration((context, config) => + { + config.SetBasePath(Directory.GetCurrentDirectory()); + config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); + }) + .ConfigureServices((context, services) => + { + var connectionString = context.Configuration.GetConnectionString("DefaultConnection"); + services.AddDbContext(options => + options.UseSqlite(connectionString)); + + services.AddSingleton(); + }) + .Build(); + + AppHost.Start(); + + using (var scope = AppHost.Services.CreateScope()) + { + var db = scope.ServiceProvider.GetRequiredService(); + //db.Database.EnsureDeleted(); // 删除数据库和表 + db.Database.EnsureCreated(); + } + + // 用 DI 创建窗口 + var mainWindow = AppHost.Services.GetRequiredService(); + mainWindow.Show(); } } diff --git a/Wpf_AiSportsMicrospace/MainWindow.xaml.cs b/Wpf_AiSportsMicrospace/MainWindow.xaml.cs index 7648320..a137ef1 100644 --- a/Wpf_AiSportsMicrospace/MainWindow.xaml.cs +++ b/Wpf_AiSportsMicrospace/MainWindow.xaml.cs @@ -1,4 +1,6 @@ -using Emgu.CV.Reg; +using AiSportsMicrospaceDB.DBContext; +using Emgu.CV.Reg; +using Microsoft.EntityFrameworkCore; using SharpDX.Direct3D9; using SkiaSharp; using System.Diagnostics; @@ -6,6 +8,7 @@ using System.Drawing.Imaging; using System.IO; using System.Net.NetworkInformation; using System.Runtime.InteropServices; +using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Interop; @@ -15,7 +18,6 @@ using System.Windows.Shapes; using System.Windows.Threading; using Wpf_AiSportsMicrospace.Common; using Wpf_AiSportsMicrospace.Dto; -using Wpf_AiSportsMicrospace.Service; using Yztob.AiSports.Inferences.Abstractions; using Yztob.AiSports.Inferences.Things; using Yztob.AiSports.Postures.Sports; @@ -41,13 +43,13 @@ public partial class MainWindow : Window private WriteableBitmap _videoBitmap; private int _lastFrameNumber = -1; - ConfigService configService = new ConfigService(); + private readonly AppDbContext _context; #endregion - - public MainWindow() + public MainWindow(AppDbContext context) { InitializeComponent(); + _context = context; // 输出到控制台 _humanPredictor = HumanPredictorFactory.Create(HumanPredictorType.SingleHigh); @@ -104,6 +106,15 @@ public partial class MainWindow : Window private void ping_Click(object sender, RoutedEventArgs e) { + var config = _context.BasicConfig.FirstOrDefault(); + + if (config != null) + { + //var ip = config.Ip; + } + + + var host = this.host.Text.Trim(); if (string.IsNullOrWhiteSpace(host)) { @@ -264,12 +275,11 @@ public partial class MainWindow : Window //VoiceBroadcast.PlayTick(); } - private void DrawJumpRope3DPointsWithGlow() + private async Task DrawJumpRope3DPointsWithGlow() { if (videoImage == null || overlayCanvas == null) return; - configService.LoadAllConfigs(); // 从文件加载 ConfigDic - ConfigSet jumpRopeConfig; + ConfigSet jumpRopeConfig = new ConfigSet(); double imgWidth = videoImage.ActualWidth; double imgHeight = videoImage.ActualHeight; @@ -282,7 +292,9 @@ public partial class MainWindow : Window bool needSaveConfig = false; - if (!configService.ConfigDic.TryGetValue("rope-skipping", out jumpRopeConfig) || jumpRopeConfig.Points.Count == 0) + var config = await _context.BasicConfig.FirstOrDefaultAsync(); + + if (config!=null) { // 没有配置,则生成默认配置 jumpRopeConfig = new ConfigSet { Name = "rope-skipping" }; @@ -351,8 +363,7 @@ public partial class MainWindow : Window // 保存配置(如果是新生成的) if (needSaveConfig) { - configService.ConfigDic[jumpRopeConfig.Name] = jumpRopeConfig; - configService.SaveAllConfigs(); + } } diff --git a/Wpf_AiSportsMicrospace/Service/ConfigService.cs b/Wpf_AiSportsMicrospace/Service/ConfigService.cs deleted file mode 100644 index 52685e1..0000000 --- a/Wpf_AiSportsMicrospace/Service/ConfigService.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.Json; -using System.Threading.Tasks; -using Wpf_AiSportsMicrospace.Dto; - -namespace Wpf_AiSportsMicrospace.Service -{ - /// - /// 配置服务 - /// - public class ConfigService - { - public Dictionary ConfigDic { get; set; } = new Dictionary(); - - public ConfigService() - { - LoadAllConfigs(); - } - - /// - /// 保存配置信息 - /// - /// - public void SaveAllConfigs(string fileName = "configs.json") - { - string basePath = AppContext.BaseDirectory; // 当前运行目录 - string filePath = Path.Combine(basePath, fileName); - - var json = JsonSerializer.Serialize(ConfigDic, new JsonSerializerOptions { WriteIndented = true }); - File.WriteAllText(filePath, json); - } - - /// - /// 加载配置信息 - /// - /// - public void LoadAllConfigs(string fileName = "configs.json") - { - string basePath = AppContext.BaseDirectory; - string filePath = Path.Combine(basePath, fileName); - - if (!File.Exists(filePath)) return; - - var json = File.ReadAllText(filePath); - ConfigDic = JsonSerializer.Deserialize>(json); - } - } -} diff --git a/Wpf_AiSportsMicrospace/Views/JumpRope/GroupJumpRope.xaml.cs b/Wpf_AiSportsMicrospace/Views/JumpRope/GroupJumpRope.xaml.cs index 0b40454..e58fbcd 100644 --- a/Wpf_AiSportsMicrospace/Views/JumpRope/GroupJumpRope.xaml.cs +++ b/Wpf_AiSportsMicrospace/Views/JumpRope/GroupJumpRope.xaml.cs @@ -29,7 +29,6 @@ using Wpf_AiSportsMicrospace.Common; using Wpf_AiSportsMicrospace.Dto; using Wpf_AiSportsMicrospace.Enum; using Wpf_AiSportsMicrospace.MyUserControl; -using Wpf_AiSportsMicrospace.Service; using WpfAnimatedGif; using Yztob.AiSports.Common; using Yztob.AiSports.Common.Implement; diff --git a/Wpf_AiSportsMicrospace/Wpf_AiSportsMicrospace.csproj b/Wpf_AiSportsMicrospace/Wpf_AiSportsMicrospace.csproj index 9830e4e..63e925d 100644 --- a/Wpf_AiSportsMicrospace/Wpf_AiSportsMicrospace.csproj +++ b/Wpf_AiSportsMicrospace/Wpf_AiSportsMicrospace.csproj @@ -9,6 +9,7 @@ + @@ -97,6 +98,12 @@ + + + Always + + + Always @@ -141,6 +148,11 @@ + + + + + @@ -153,6 +165,10 @@ + + + + ..\sdks\Yunzhi.Library.dll diff --git a/Wpf_AiSportsMicrospace/Wpf_AiSportsMicrospace.sln b/Wpf_AiSportsMicrospace/Wpf_AiSportsMicrospace.sln index cd84066..ce8b74a 100644 --- a/Wpf_AiSportsMicrospace/Wpf_AiSportsMicrospace.sln +++ b/Wpf_AiSportsMicrospace/Wpf_AiSportsMicrospace.sln @@ -1,10 +1,12 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.13.35828.75 d17.13 +# Visual Studio Version 18 +VisualStudioVersion = 18.0.11111.16 d18.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wpf_AiSportsMicrospace", "Wpf_AiSportsMicrospace.csproj", "{345052A8-36AD-4739-80F6-991A4DD84ADC}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AiSportsMicrospaceDB", "..\AiSportsMicrospaceDB\AiSportsMicrospaceDB.csproj", "{76186799-4B51-4DE3-9F61-E0F4B5A40553}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -15,6 +17,10 @@ Global {345052A8-36AD-4739-80F6-991A4DD84ADC}.Debug|Any CPU.Build.0 = Debug|Any CPU {345052A8-36AD-4739-80F6-991A4DD84ADC}.Release|Any CPU.ActiveCfg = Release|Any CPU {345052A8-36AD-4739-80F6-991A4DD84ADC}.Release|Any CPU.Build.0 = Release|Any CPU + {76186799-4B51-4DE3-9F61-E0F4B5A40553}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76186799-4B51-4DE3-9F61-E0F4B5A40553}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76186799-4B51-4DE3-9F61-E0F4B5A40553}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76186799-4B51-4DE3-9F61-E0F4B5A40553}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Wpf_AiSportsMicrospace/appsettings.json b/Wpf_AiSportsMicrospace/appsettings.json new file mode 100644 index 0000000..877ad19 --- /dev/null +++ b/Wpf_AiSportsMicrospace/appsettings.json @@ -0,0 +1,5 @@ +{ + "ConnectionStrings": { + "DefaultConnection": "Data Source=AiSportsMicrospaceDB.db" + } +} \ No newline at end of file