Explorar el Código

20250721001 用户管理界面添加,用户登录页面添加,开屏加载页面添加,主流程添加预加载,异常信息记录模块,轻量化嵌入式数据库模块

向羽 孟 hace 9 meses
padre
commit
1ef043f99b
Se han modificado 50 ficheros con 1664 adiciones y 114 borrados
  1. 28 4
      CCDCountWpf/App.config
  2. 1 2
      CCDCountWpf/App.xaml
  3. 26 1
      CCDCountWpf/App.xaml.cs
  4. 88 12
      CCDCountWpf/CCDCountWpf.csproj
  5. BIN
      CCDCountWpf/FromImage/export.png
  6. BIN
      CCDCountWpf/FromImage/mmexport1752891278116.jpg
  7. BIN
      CCDCountWpf/FromImage/print.png
  8. BIN
      CCDCountWpf/FromImage/中断_白.png
  9. BIN
      CCDCountWpf/FromImage/刷新_白.png
  10. BIN
      CCDCountWpf/FromImage/故障.png
  11. BIN
      CCDCountWpf/FromImage/数据_白.png
  12. BIN
      CCDCountWpf/FromImage/暂停 _白.png
  13. BIN
      CCDCountWpf/FromImage/用户修改.png
  14. BIN
      CCDCountWpf/FromImage/用户删除.png
  15. BIN
      CCDCountWpf/FromImage/用户增加.png
  16. BIN
      CCDCountWpf/FromImage/用户管理.png
  17. BIN
      CCDCountWpf/FromImage/相机小_白.png
  18. BIN
      CCDCountWpf/FromImage/设置_白.png
  19. BIN
      CCDCountWpf/FromImage/运行_白.png
  20. BIN
      CCDCountWpf/FromImage/退出_白.png
  21. 132 1
      CCDCountWpf/ShowBindingClass.cs
  22. 59 0
      CCDCountWpf/WpfFrom/AddUserWindow.xaml
  23. 69 0
      CCDCountWpf/WpfFrom/AddUserWindow.xaml.cs
  24. 79 0
      CCDCountWpf/WpfFrom/ChangeUserWindow.xaml
  25. 89 0
      CCDCountWpf/WpfFrom/ChangeUserWindow.xaml.cs
  26. 15 3
      CCDCountWpf/WpfFrom/MainWindow.xaml
  27. 62 48
      CCDCountWpf/WpfFrom/MainWindow.xaml.cs
  28. 18 0
      CCDCountWpf/WpfFrom/SplashWindow.xaml
  29. 27 0
      CCDCountWpf/WpfFrom/SplashWindow.xaml.cs
  30. 62 0
      CCDCountWpf/WpfFrom/UserLoginWindow.xaml
  31. 60 0
      CCDCountWpf/WpfFrom/UserLoginWindow.xaml.cs
  32. 1 1
      CCDCountWpf/WpfPage/MainPage.xaml
  33. 23 0
      CCDCountWpf/WpfPage/MessagePage.xaml
  34. 29 0
      CCDCountWpf/WpfPage/MessagePage.xaml.cs
  35. 7 7
      CCDCountWpf/WpfPage/SettingPage.xaml.cs
  36. 51 0
      CCDCountWpf/WpfPage/UserManagementPage.xaml
  37. 71 0
      CCDCountWpf/WpfPage/UserManagementPage.xaml.cs
  38. 9 0
      CCDCountWpf/packages.config
  39. 32 1
      TestWork.DLL/CCDCount.DLL.csproj
  40. 52 15
      TestWork.DLL/CameraClass.cs
  41. 95 0
      TestWork.DLL/FaultLogClass.cs
  42. 24 6
      TestWork.DLL/MainThreadClass.cs
  43. 104 0
      TestWork.DLL/SqlDataClass/ErrorMesSqliteDataClass.cs
  44. 268 0
      TestWork.DLL/SqlDataClass/UserMessSqliteDataClass.cs
  45. 0 12
      TestWork.DLL/Tools/SqliteDataClass.cs
  46. 16 0
      TestWork.DLL/app.config
  47. 6 0
      TestWork.DLL/packages.config
  48. 2 1
      TestWork.MODEL/CCDCount.MODEL.csproj
  49. 40 0
      TestWork.MODEL/SqlDataModel/ErroeMesDataModelClass.cs
  50. 19 0
      TestWork.MODEL/SqlDataModel/UserMesDataModelClass.cs

+ 28 - 4
CCDCountWpf/App.config

@@ -1,6 +1,30 @@
-<?xml version="1.0" encoding="utf-8" ?>
+<?xml version="1.0" encoding="utf-8"?>
 <configuration>
-    <startup> 
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
-    </startup>
+  <configSections>
+    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
+    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+  </configSections>
+  <startup>
+    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
+  </startup>
+  <runtime>
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <dependentAssembly>
+        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.4.1" newVersion="4.0.4.1" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
+  <entityFramework>
+    <providers>
+      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
+      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
+    </providers>
+  </entityFramework>
+  <system.data>
+    <DbProviderFactories>
+      <remove invariant="System.Data.SQLite.EF6" />
+      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
+    <remove invariant="System.Data.SQLite" /><add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" /></DbProviderFactories>
+  </system.data>
 </configuration>

+ 1 - 2
CCDCountWpf/App.xaml

@@ -1,8 +1,7 @@
 <Application x:Class="CCDCountWpf.App"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-             xmlns:local="clr-namespace:CCDCountWpf"
-             StartupUri="MainWindow.xaml">
+             xmlns:local="clr-namespace:CCDCountWpf" StartupUri="/WpfFrom/UserLoginWindow.xaml">
     <Application.Resources>
          
     </Application.Resources>

+ 26 - 1
CCDCountWpf/App.xaml.cs

@@ -1,13 +1,38 @@
-using System;
+using CCDCount.DLL;
+using CCDCount.DLL.SqlDataClass;
+using CCDCount.MODEL.SqlDataModel;
+using System;
 using System.Collections.Generic;
 using System.Configuration;
 using System.Data;
 using System.Linq;
+using System.Threading;
 using System.Threading.Tasks;
 using System.Windows;
+using System.Windows.Threading;
 
 namespace CCDCountWpf
 {
+    public static class MessageBus
+    {
+        public static List<MainThreadClass> MainThreadS = new List<MainThreadClass>();
+
+        public static MainThreadClass NowSettingLoadMainThread = null;
+
+        public static ShowBindingClass ShowBinding = new ShowBindingClass();
+
+        public static CameraClass CameraClass = new CameraClass();
+
+        public static FaultLogClass faultLogClass = new FaultLogClass($"{AppDomain.CurrentDomain.BaseDirectory}DATA\\FaultMessage{DateTime.Now:yyyyMMdd}.db");
+
+        public static UserMessSqliteDataClass UserMessageClass = new UserMessSqliteDataClass($"{AppDomain.CurrentDomain.BaseDirectory}DATA\\UserData\\UserMessage.db");
+
+        public static UserMesDataModelClass NowLoginUserMessage = null;
+
+        public static string NowLoadCammeraSN = string.Empty;
+        public static int SeetingNowLoadInMaThreadsIndex = -1;
+        public static int NowLoadCameraIndex = -1;
+    }
     /// <summary>
     /// App.xaml 的交互逻辑
     /// </summary>

+ 88 - 12
CCDCountWpf/CCDCountWpf.csproj

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="..\packages\EntityFramework.6.4.4\build\EntityFramework.props" Condition="Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.props')" />
   <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -14,6 +15,8 @@
     <WarningLevel>4</WarningLevel>
     <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
     <Deterministic>true</Deterministic>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <PlatformTarget>x64</PlatformTarget>
@@ -36,6 +39,12 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
+    <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+      <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.dll</HintPath>
+    </Reference>
+    <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+      <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.SqlServer.dll</HintPath>
+    </Reference>
     <Reference Include="MvCameraControl.Net, Version=4.3.2.2, Culture=neutral, PublicKeyToken=a3c7c5e3a730cd12, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
       <HintPath>..\TestWork.DLL\DLL\MvCameraControl.Net.dll</HintPath>
@@ -45,7 +54,17 @@
       <HintPath>..\TestWork.DLL\DLL\MvFGCtrlC.Net.dll</HintPath>
     </Reference>
     <Reference Include="System" />
+    <Reference Include="System.ComponentModel.DataAnnotations" />
     <Reference Include="System.Data" />
+    <Reference Include="System.Data.SQLite, Version=1.0.119.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
+      <HintPath>..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.119.0\lib\net46\System.Data.SQLite.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data.SQLite.EF6, Version=1.0.119.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Data.SQLite.EF6.1.0.119.0\lib\net46\System.Data.SQLite.EF6.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data.SQLite.Linq, Version=1.0.119.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Data.SQLite.Linq.1.0.119.0\lib\net46\System.Data.SQLite.Linq.dll</HintPath>
+    </Reference>
     <Reference Include="System.Drawing" />
     <Reference Include="System.Xml" />
     <Reference Include="Microsoft.CSharp" />
@@ -65,14 +84,48 @@
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </ApplicationDefinition>
+    <Compile Include="WpfFrom\AddUserWindow.xaml.cs">
+      <DependentUpon>AddUserWindow.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="WpfFrom\ChangeUserWindow.xaml.cs">
+      <DependentUpon>ChangeUserWindow.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="WpfFrom\SplashWindow.xaml.cs">
+      <DependentUpon>SplashWindow.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="WpfFrom\UserLoginWindow.xaml.cs">
+      <DependentUpon>UserLoginWindow.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="WpfPage\MessagePage.xaml.cs">
+      <DependentUpon>MessagePage.xaml</DependentUpon>
+    </Compile>
     <Compile Include="WpfPage\SettingPage.xaml.cs">
       <DependentUpon>SettingPage.xaml</DependentUpon>
     </Compile>
+    <Compile Include="WpfPage\UserManagementPage.xaml.cs">
+      <DependentUpon>UserManagementPage.xaml</DependentUpon>
+    </Compile>
+    <Page Include="WpfFrom\AddUserWindow.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="WpfFrom\ChangeUserWindow.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="WpfFrom\SplashWindow.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="WpfFrom\UserLoginWindow.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="WpfPage\MainPage.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
-    <Page Include="MainWindow.xaml">
+    <Page Include="WpfFrom\MainWindow.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </Page>
@@ -84,14 +137,22 @@
     <Compile Include="WpfPage\MainPage.xaml.cs">
       <DependentUpon>MainPage.xaml</DependentUpon>
     </Compile>
-    <Compile Include="MainWindow.xaml.cs">
+    <Compile Include="WpfFrom\MainWindow.xaml.cs">
       <DependentUpon>MainWindow.xaml</DependentUpon>
       <SubType>Code</SubType>
     </Compile>
+    <Page Include="WpfPage\MessagePage.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="WpfPage\SettingPage.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="WpfPage\UserManagementPage.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Properties\AssemblyInfo.cs">
@@ -111,6 +172,7 @@
       <Generator>ResXFileCodeGenerator</Generator>
       <LastGenOutput>Resources.Designer.cs</LastGenOutput>
     </EmbeddedResource>
+    <None Include="packages.config" />
     <None Include="Properties\Settings.settings">
       <Generator>SettingsSingleFileGenerator</Generator>
       <LastGenOutput>Settings.Designer.cs</LastGenOutput>
@@ -119,24 +181,16 @@
   <ItemGroup>
     <None Include="App.config" />
   </ItemGroup>
-  <ItemGroup>
-    <Resource Include="FromImage\数据_白.png" />
-    <Resource Include="FromImage\相机小_白.png" />
-    <Resource Include="FromImage\设置_白.png" />
-  </ItemGroup>
   <ItemGroup>
     <Resource Include="FromImage\数据.png" />
     <Resource Include="FromImage\相机小.png" />
     <Resource Include="FromImage\设置.png" />
   </ItemGroup>
   <ItemGroup>
-    <Resource Include="FromImage\退出_白.png" />
     <Resource Include="FromImage\退出.png" />
   </ItemGroup>
   <ItemGroup>
-    <Resource Include="FromImage\中断_白.png" />
     <Resource Include="FromImage\中断.png" />
-    <Resource Include="FromImage\运行_白.png" />
     <Resource Include="FromImage\运行.png" />
   </ItemGroup>
   <ItemGroup>
@@ -151,11 +205,33 @@
   </ItemGroup>
   <ItemGroup>
     <Resource Include="FromImage\刷新.png" />
-    <Resource Include="FromImage\刷新_白.png" />
   </ItemGroup>
   <ItemGroup>
-    <Resource Include="FromImage\暂停 _白.png" />
     <Resource Include="FromImage\暂停.png" />
   </ItemGroup>
+  <ItemGroup>
+    <Resource Include="FromImage\故障.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <Resource Include="FromImage\export.png" />
+    <Resource Include="FromImage\print.png" />
+    <Resource Include="FromImage\用户修改.png" />
+    <Resource Include="FromImage\用户删除.png" />
+    <Resource Include="FromImage\用户增加.png" />
+    <Resource Include="FromImage\用户管理.png" />
+  </ItemGroup>
+  <ItemGroup>
+    <Resource Include="FromImage\mmexport1752891278116.jpg" />
+  </ItemGroup>
   <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\EntityFramework.6.4.4\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.props'))" />
+    <Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.targets'))" />
+    <Error Condition="!Exists('..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.119.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.119.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets'))" />
+  </Target>
+  <Import Project="..\packages\EntityFramework.6.4.4\build\EntityFramework.targets" Condition="Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" />
+  <Import Project="..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.119.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets" Condition="Exists('..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.119.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets')" />
 </Project>

BIN
CCDCountWpf/FromImage/export.png


BIN
CCDCountWpf/FromImage/mmexport1752891278116.jpg


BIN
CCDCountWpf/FromImage/print.png


BIN
CCDCountWpf/FromImage/中断_白.png


BIN
CCDCountWpf/FromImage/刷新_白.png


BIN
CCDCountWpf/FromImage/故障.png


BIN
CCDCountWpf/FromImage/数据_白.png


BIN
CCDCountWpf/FromImage/暂停 _白.png


BIN
CCDCountWpf/FromImage/用户修改.png


BIN
CCDCountWpf/FromImage/用户删除.png


BIN
CCDCountWpf/FromImage/用户增加.png


BIN
CCDCountWpf/FromImage/用户管理.png


BIN
CCDCountWpf/FromImage/相机小_白.png


BIN
CCDCountWpf/FromImage/设置_白.png


BIN
CCDCountWpf/FromImage/运行_白.png


BIN
CCDCountWpf/FromImage/退出_白.png


+ 132 - 1
CCDCountWpf/ShowBindingClass.cs

@@ -1,8 +1,10 @@
 using CCDCount.MODEL.ConfigModel;
+using CCDCount.MODEL.SqlDataModel;
 using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.ComponentModel;
+using System.Drawing.Text;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
@@ -220,7 +222,10 @@ namespace CCDCountWpf
                 if (MessageBus.NowSettingLoadMainThread != null && float.TryParse(value, out float newValue))
                 {
                     // 同步更新到MessageBus
+                    float oldValue = MessageBus.NowSettingLoadMainThread.cameraConfig.ExposureTimeValue;
                     MessageBus.NowSettingLoadMainThread.cameraConfig.ExposureTimeValue = newValue;
+                    MessageBus.NowSettingLoadMainThread.CameraConfigIsChange = true;
+                    MessageBus.faultLogClass.RecordValueChangeMessage($"相机{MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum}的曝光时间已从{oldValue}修改为{newValue}", 0);
                     OnPropertyChanged("ExposureTimeValue");
                 }
             }
@@ -248,7 +253,10 @@ namespace CCDCountWpf
                 {
                     try
                     {
+                        float oldValue = MessageBus.NowSettingLoadMainThread.cameraConfig.AcquistionLineRateValue;
                         MessageBus.NowSettingLoadMainThread.cameraConfig.AcquistionLineRateValue = int.Parse(value);
+                        MessageBus.NowSettingLoadMainThread.CameraConfigIsChange = true;
+                        MessageBus.faultLogClass.RecordValueChangeMessage($"相机{MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum}的行频从{oldValue}修改为{value}", 0);
                         OnPropertyChanged("AcquistionLineRate");
                     }
                     catch (Exception)
@@ -282,7 +290,10 @@ namespace CCDCountWpf
                 {
                     try
                     {
+                        int oldValue = MessageBus.NowSettingLoadMainThread.cameraConfig.Height;
                         MessageBus.NowSettingLoadMainThread.cameraConfig.Height = int.Parse(value);
+                        MessageBus.NowSettingLoadMainThread.CameraConfigIsChange = true;
+                        MessageBus.faultLogClass.RecordValueChangeMessage($"相机{MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum}的图像高从{oldValue}修改为{value}", 0);
                         OnPropertyChanged("ImageHeight");
                     }
                     catch (Exception)
@@ -316,7 +327,10 @@ namespace CCDCountWpf
                 {
                     try
                     {
+                        int oldValue = MessageBus.NowSettingLoadMainThread.cameraConfig.Width;
                         MessageBus.NowSettingLoadMainThread.cameraConfig.Width = int.Parse(value);
+                        MessageBus.NowSettingLoadMainThread.CameraConfigIsChange = true;
+                        MessageBus.faultLogClass.RecordValueChangeMessage($"相机{MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum}的图像宽从{oldValue}修改为{value}", 0);
                         OnPropertyChanged("ImageWidth");
                     }
                     catch (Exception)
@@ -350,7 +364,10 @@ namespace CCDCountWpf
                 {
                     try
                     {
+                        string oldValue = MessageBus.NowSettingLoadMainThread.cameraConfig.CameraName == "" ? "null" : MessageBus.NowSettingLoadMainThread.cameraConfig.CameraName;
                         MessageBus.NowSettingLoadMainThread.cameraConfig.CameraName = value;
+                        MessageBus.NowSettingLoadMainThread.CameraConfigIsChange = true;
+                        MessageBus.faultLogClass.RecordValueChangeMessage($"相机{MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum}的用户自定义名从{oldValue}修改为{value}", 0);
                         OnPropertyChanged("CamUserName");
                     }
                     catch (Exception)
@@ -384,7 +401,10 @@ namespace CCDCountWpf
                 {
                     try
                     {
+                        int oldValue = MessageBus.NowSettingLoadMainThread.cameraConfig.OffsetX;
                         MessageBus.NowSettingLoadMainThread.cameraConfig.OffsetX = int.Parse(value);
+                        MessageBus.NowSettingLoadMainThread.CameraConfigIsChange = true;
+                        MessageBus.faultLogClass.RecordValueChangeMessage($"相机{MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum}的图像X偏移从{oldValue}修改为{value}", 0);
                         OnPropertyChanged("CamOffsetX");
                     }
                     catch (Exception)
@@ -404,8 +424,40 @@ namespace CCDCountWpf
         /// <summary>
         /// 当前选择的相机SN
         /// </summary>
-        public string SelectedCameraSN { get; set;}
+        public string CameraSNNum
+        {
+            get
+            {
+                if (MessageBus.NowSettingLoadMainThread != null)
+                {
+                    return MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum.ToString();
+                }
+                else
+                {
+                    return "";
+                }
+            }
+            set
+            {
+                if (MessageBus.NowSettingLoadMainThread != null)
+                {
+                    try
+                    {
+                        string oldValue = MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum;
+                        MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum = value;
+                        MessageBus.NowSettingLoadMainThread.shuLiConfig.CameraSN = value;
+                        MessageBus.NowSettingLoadMainThread.CameraConfigIsChange = true;
+                        MessageBus.faultLogClass.RecordValueChangeMessage($"相机{MessageBus.NowSettingLoadMainThread.cameraConfig.CamerNo}的SN从{oldValue}修改为{value}", 0);
+                        OnPropertyChanged("CameraSNNum");
+                    }
+                    catch (Exception)
+                    {
+                        Console.WriteLine("CameraSNNum-SetError");
+                    }
 
+                }
+            }
+        }
         /// <summary>
         /// 预处理阈值
         /// </summary>
@@ -428,7 +480,9 @@ namespace CCDCountWpf
                 {
                     try
                     {
+                        int oldValue = MessageBus.NowSettingLoadMainThread.shuLiConfig.RegionThreshold;
                         MessageBus.NowSettingLoadMainThread.shuLiConfig.RegionThreshold = int.Parse(value);
+                        MessageBus.faultLogClass.RecordValueChangeMessage($"数粒识别{MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum}的预处理阈值从{oldValue}修改为{value}", 0);
                         OnPropertyChanged("RegionThreshold");
                     }
                     catch (Exception)
@@ -462,7 +516,9 @@ namespace CCDCountWpf
                 {
                     try
                     {
+                        int oldValue = MessageBus.NowSettingLoadMainThread.shuLiConfig.Channel;
                         MessageBus.NowSettingLoadMainThread.shuLiConfig.Channel = int.Parse(value);
+                        MessageBus.faultLogClass.RecordValueChangeMessage($"数粒识别{MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum}的通道数从{oldValue}修改为{value}", 0);
                         OnPropertyChanged("Channel");
                     }
                     catch (Exception)
@@ -496,7 +552,9 @@ namespace CCDCountWpf
                 {
                     try
                     {
+                        int oldValue = MessageBus.NowSettingLoadMainThread.shuLiConfig.NoiseFilter_Threshold;
                         MessageBus.NowSettingLoadMainThread.shuLiConfig.NoiseFilter_Threshold = int.Parse(value);
+                        MessageBus.faultLogClass.RecordValueChangeMessage($"数粒识别{MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum}的噪声滤波阈值从{oldValue}修改为{value}", 0);
                         OnPropertyChanged("NoiseFilter");
                     }
                     catch (Exception)
@@ -530,7 +588,9 @@ namespace CCDCountWpf
                 {
                     try
                     {
+                        int oldValue = MessageBus.NowSettingLoadMainThread.shuLiConfig.MIN_OBJECT_WIDTH;
                         MessageBus.NowSettingLoadMainThread.shuLiConfig.MIN_OBJECT_WIDTH = int.Parse(value);
+                        MessageBus.faultLogClass.RecordValueChangeMessage($"数粒识别{MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum}的异常粒最小宽从{oldValue}修改为{value}", 0);
                         OnPropertyChanged("MIN_OBJECT_WIDTH");
                     }
                     catch (Exception)
@@ -564,7 +624,9 @@ namespace CCDCountWpf
                 {
                     try
                     {
+                        int oldValue = MessageBus.NowSettingLoadMainThread.shuLiConfig.MAX_OBJECT_WIDTH;
                         MessageBus.NowSettingLoadMainThread.shuLiConfig.MAX_OBJECT_WIDTH = int.Parse(value);
+                        MessageBus.faultLogClass.RecordValueChangeMessage($"数粒识别{MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum}的异常粒最大宽从{oldValue}修改为{value}", 0);
                         OnPropertyChanged("MAX_OBJECT_WIDTH");
                     }
                     catch (Exception)
@@ -598,7 +660,9 @@ namespace CCDCountWpf
                 {
                     try
                     {
+                        int oldValue = MessageBus.NowSettingLoadMainThread.shuLiConfig.MIN_OBJECT_HEIGHT;
                         MessageBus.NowSettingLoadMainThread.shuLiConfig.MIN_OBJECT_HEIGHT = int.Parse(value);
+                        MessageBus.faultLogClass.RecordValueChangeMessage($"数粒识别{MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum}的异常粒最小高从{oldValue}修改为{value}", 0);
                         OnPropertyChanged("MIN_OBJECT_HEIGHT");
                     }
                     catch (Exception)
@@ -632,7 +696,9 @@ namespace CCDCountWpf
                 {
                     try
                     {
+                        int oldValue = MessageBus.NowSettingLoadMainThread.shuLiConfig.MAX_OBJECT_HEIGHT;
                         MessageBus.NowSettingLoadMainThread.shuLiConfig.MAX_OBJECT_HEIGHT = int.Parse(value);
+                        MessageBus.faultLogClass.RecordValueChangeMessage($"数粒识别{MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum}的异常粒最大高从{oldValue}修改为{value}", 0);
                         OnPropertyChanged("MAX_OBJECT_HEIGHT");
                     }
                     catch (Exception)
@@ -666,7 +732,9 @@ namespace CCDCountWpf
                 {
                     try
                     {
+                        int oldValue = MessageBus.NowSettingLoadMainThread.shuLiConfig.MinArea;
                         MessageBus.NowSettingLoadMainThread.shuLiConfig.MinArea = int.Parse(value);
+                        MessageBus.faultLogClass.RecordValueChangeMessage($"数粒识别{MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum}的异常粒最小面积从{oldValue}修改为{value}", 0);
                         OnPropertyChanged("MinArea");
                     }
                     catch (Exception)
@@ -700,7 +768,9 @@ namespace CCDCountWpf
                 {
                     try
                     {
+                        int oldValue = MessageBus.NowSettingLoadMainThread.shuLiConfig.MaxArea;
                         MessageBus.NowSettingLoadMainThread.shuLiConfig.MaxArea = int.Parse(value);
+                        MessageBus.faultLogClass.RecordValueChangeMessage($"数粒识别{MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum}的异常粒最大面积从{oldValue}修改为{value}", 0);
                         OnPropertyChanged("MaxArea");
                     }
                     catch (Exception)
@@ -712,6 +782,67 @@ namespace CCDCountWpf
             }
         }
 
+        /// <summary>
+        /// 异常粒识别码
+        /// </summary>
+        public string PandingCode
+        {
+            get
+            {
+                if (MessageBus.NowSettingLoadMainThread != null)
+                {
+                    return MessageBus.NowSettingLoadMainThread.shuLiConfig.MaxArea.ToString();
+                }
+                else
+                {
+                    return "";
+                }
+            }
+            set
+            {
+                if (MessageBus.NowSettingLoadMainThread != null)
+                {
+                    try
+                    {
+                        int oldValue = MessageBus.NowSettingLoadMainThread.shuLiConfig.PandingCode;
+                        if(oldValue != int.Parse(value))
+                        {
+                            MessageBus.NowSettingLoadMainThread.shuLiConfig.PandingCode = int.Parse(value);
+                            MessageBus.faultLogClass.RecordValueChangeMessage($"数粒识别{MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum}的判断标准识别码从{oldValue}修改为{value}", 0);
+                        }
+                        OnPropertyChanged("PandingCode");
+                    }
+                    catch (Exception)
+                    {
+                        Console.WriteLine("PandingCode-SetError");
+                    }
+
+                }
+            }
+        }
+
+        private List<ErroeMesDataModelClass> errMessageList = new List<ErroeMesDataModelClass>();
+        public List<ErroeMesDataModelClass> ErrMessageShowList
+        {
+            get { return errMessageList; }
+            set
+            {
+                errMessageList = value;
+                OnPropertyChanged("errMessageList");
+            }
+        }
+
+        private List<UserMesDataModelClass> userMesDataModels = new List<UserMesDataModelClass>();
+        public List<UserMesDataModelClass> UserMesDataModels
+        {
+            get { return userMesDataModels; }
+            set
+            {
+                userMesDataModels = value;
+                OnPropertyChanged("userMesDataModels");
+            }
+        }
+
         //数据绑定核心实现
         public event PropertyChangedEventHandler PropertyChanged;
 

+ 59 - 0
CCDCountWpf/WpfFrom/AddUserWindow.xaml

@@ -0,0 +1,59 @@
+<Window x:Class="CCDCountWpf.WpfFrom.AddUserWindow"
+        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:CCDCountWpf.WpfFrom"
+        mc:Ignorable="d"
+        Title="AddUserWindow" Height="350" Width="300" ResizeMode="NoResize"
+        WindowStartupLocation="CenterScreen" Icon="/FromImage/mmexport1752891278116.jpg" Loaded="Window_Loaded">
+    <Grid>
+        <Grid Height="60" VerticalAlignment="Top" Background="#B20092FF">
+            <Label Content="添加用户" Margin="0,15,0,0" FontWeight="Bold" FontSize="20" VerticalAlignment="Top" HorizontalAlignment="Center"/>
+        </Grid>
+        <StackPanel Orientation="Vertical" Margin="0,60,0,0">
+            <StackPanel Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="19,0,0,0">
+                <Label  Content="用户名:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="20"/>
+                <TextBox x:Name="UserNameTbx" HorizontalAlignment="Left" Margin="22,15,0,0"  Width="120" FontWeight="Bold" FontSize="20" Background="{x:Null}"/>
+            </StackPanel>
+            <StackPanel Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="19,0,0,0">
+                <Label  Content="密码:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="20"/>
+                <PasswordBox x:Name="UserPassTbx"  HorizontalAlignment="Left" Margin="41,15,0,0" VerticalAlignment="Top" Width="120" FontWeight="Bold" FontSize="20" Background="{x:Null}"  />
+            </StackPanel>
+            <StackPanel Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="19,0,0,0">
+                <Label  Content="确认密码:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="20"/>
+                <PasswordBox x:Name="UserRePassTbx"  HorizontalAlignment="Left" Margin="0,15,0,0" VerticalAlignment="Top" Width="120" FontWeight="Bold" FontSize="20" Background="{x:Null}"  />
+            </StackPanel>
+            <StackPanel Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="19,0,0,0">
+                <Label  Content="权限:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="20"/>
+                <ComboBox x:Name="UserLevelCbx" HorizontalAlignment="Left" Margin="41,12,0,0" VerticalAlignment="Top" Width="120" FontWeight="Bold" FontSize="20" Background="{x:Null}" IsReadOnly="True"/>
+            </StackPanel>
+            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
+                <Button x:Name="AddUserBtn" Content="添加" BorderThickness="1" HorizontalAlignment="Left" Margin="0,10,0,0" VerticalAlignment="Top" Width="80" Height="40" Background="#B20123FF" FontWeight="Bold" FontSize="20" Foreground="White" Click="AddUserBtn_Click" Cursor="Hand">
+                    <Button.Template>
+                        <ControlTemplate TargetType="Button">
+                            <Border CornerRadius="5" 
+                                            Background="{TemplateBinding Background}"
+                                            BorderBrush="{TemplateBinding BorderBrush}"
+                                            BorderThickness="{TemplateBinding BorderThickness}">
+                                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                            </Border>
+                        </ControlTemplate>
+                    </Button.Template>
+                </Button>
+                <Button x:Name="UserCancelBtn" Content="取消" BorderThickness="1" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="80" Height="40" Background="#B20123FF" FontWeight="Bold" FontSize="20" Foreground="White" Click="UserCancelBtn_Click" Cursor="Hand">
+                    <Button.Template>
+                        <ControlTemplate TargetType="Button">
+                            <Border CornerRadius="5" 
+                                            Background="{TemplateBinding Background}"
+                                            BorderBrush="{TemplateBinding BorderBrush}"
+                                            BorderThickness="{TemplateBinding BorderThickness}">
+                                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                            </Border>
+                        </ControlTemplate>
+                    </Button.Template>
+                </Button>
+            </StackPanel>
+        </StackPanel>
+    </Grid>
+</Window>

+ 69 - 0
CCDCountWpf/WpfFrom/AddUserWindow.xaml.cs

@@ -0,0 +1,69 @@
+using CCDCount.MODEL.SqlDataModel;
+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;
+
+namespace CCDCountWpf.WpfFrom
+{
+    /// <summary>
+    /// AddUserWindow.xaml 的交互逻辑
+    /// </summary>
+    public partial class AddUserWindow : Window
+    {
+        public AddUserWindow()
+        {
+            InitializeComponent();
+        }
+
+        private void UserCancelBtn_Click(object sender, RoutedEventArgs e)
+        {
+            this.Close();
+        }
+
+        private void AddUserBtn_Click(object sender, RoutedEventArgs e)
+        {
+            if (UserNameTbx.Text == "" || UserPassTbx.Password == "" || UserRePassTbx.Password == "" || UserLevelCbx.SelectedItem == null)
+            {
+                MessageBox.Show("请将信息填写完整");
+                return;
+            }
+            if(UserPassTbx.Password == UserRePassTbx.Password)
+            {
+                MessageBus.UserMessageClass.InsertUserMessage(new UserMesDataModelClass()
+                {
+                    UserName = UserNameTbx.Text,
+                    PassWord = MessageBus.UserMessageClass.HashPassword(UserPassTbx.Password),
+                    UserMes = "测试",
+                    DateTime = DateTime.Now,
+                    IsDelete = false,
+                    IsAdmin = UserLevelCbx.SelectedItem.ToString() == "管理员" ? true : false
+                });
+            }
+            else
+            {
+                MessageBox.Show("密码不一致");
+                return;
+            }
+                MessageBox.Show("添加成功");
+            MessageBus.ShowBinding.UserMesDataModels = MessageBus.UserMessageClass.GetAllUserMessage();
+            this.Close();
+        }
+
+        private void Window_Loaded(object sender, RoutedEventArgs e)
+        {
+            UserLevelCbx.Items.Add("管理员");
+            UserLevelCbx.Items.Add("普通用户");
+            UserLevelCbx.SelectedIndex = 1;
+        }
+    }
+}

+ 79 - 0
CCDCountWpf/WpfFrom/ChangeUserWindow.xaml

@@ -0,0 +1,79 @@
+<Window x:Class="CCDCountWpf.WpfFrom.ChangeUserWindow"
+        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:CCDCountWpf.WpfFrom"
+        mc:Ignorable="d"
+        Title="ChangeUserWindow" Height="430" Width="320" ResizeMode="NoResize"
+        WindowStartupLocation="CenterScreen" Icon="/FromImage/mmexport1752891278116.jpg" Loaded="Window_Loaded">
+    <Grid>
+        <Grid Height="60" VerticalAlignment="Top" Background="#B20092FF">
+            <Label Content="编辑用户" Margin="0,15,0,0" FontWeight="Bold" FontSize="20" VerticalAlignment="Top" HorizontalAlignment="Center"/>
+        </Grid>
+        <StackPanel Orientation="Vertical" Margin="0,60,0,0">
+            <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="30,0,0,0">
+                <Label  Content="ID:" HorizontalAlignment="Left" Margin="0,10,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="20"/>
+                <TextBox x:Name="UserIDTbx" HorizontalAlignment="Left" Margin="77,15,0,0"  Width="120" FontWeight="Bold" FontSize="20" Background="{x:Null}" IsReadOnly="True"/>
+            </StackPanel>
+            <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="30,0,0,0">
+                <Label  Content="用户名:" HorizontalAlignment="Left" Margin="0,10,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="20"/>
+                <TextBox x:Name="UserNameTbx" HorizontalAlignment="Left" Margin="40,15,0,0"  Width="120" FontWeight="Bold" FontSize="20" Background="{x:Null}"/>
+            </StackPanel>
+            <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="30,0,0,0">
+                <Label  Content="旧密码:" HorizontalAlignment="Left" Margin="0,10,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="20"/>
+                <PasswordBox x:Name="UserOldPassTbx"  HorizontalAlignment="Left" Margin="40,15,0,0" VerticalAlignment="Top" Width="120" FontWeight="Bold" FontSize="20" Background="{x:Null}"  />
+            </StackPanel>
+            <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="30,0,0,0">
+                <Label  Content="新密码:" HorizontalAlignment="Left" Margin="0,10,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="20"/>
+                <PasswordBox x:Name="UserNewPassTbx"  HorizontalAlignment="Left" Margin="40,15,0,0" VerticalAlignment="Top" Width="120" FontWeight="Bold" FontSize="20" Background="{x:Null}"  />
+            </StackPanel>
+            <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" Margin="30,0,0,0">
+                <Label  Content="重复新密码:" HorizontalAlignment="Left" Margin="0,10,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="20"/>
+                <PasswordBox x:Name="UserReNewPassTbx"  HorizontalAlignment="Left" Margin="0,15,0,0" VerticalAlignment="Top" Width="120" FontWeight="Bold" FontSize="20" Background="{x:Null}"  />
+            </StackPanel>
+            <StackPanel Orientation="Horizontal" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="19,0,0,0">
+                <Label  Content="权限:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="20"/>
+                <ComboBox x:Name="UserLevelCbx" HorizontalAlignment="Left" Margin="61,12,0,0" VerticalAlignment="Top" Width="120" FontWeight="Bold" FontSize="20" Background="{x:Null}" IsReadOnly="True"/>
+            </StackPanel>
+            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
+                <Button x:Name="UserChangeBtn" Content="修改" BorderThickness="1" HorizontalAlignment="Left" Margin="0,10,10,0" VerticalAlignment="Top" Width="80" Height="40" Background="#B20123FF" FontWeight="Bold" FontSize="20" Foreground="White" Click="UserChangeBtn_Click" Cursor="Hand">
+                    <Button.Template>
+                        <ControlTemplate TargetType="Button">
+                            <Border CornerRadius="5" 
+                                            Background="{TemplateBinding Background}"
+                                            BorderBrush="{TemplateBinding BorderBrush}"
+                                            BorderThickness="{TemplateBinding BorderThickness}">
+                                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                            </Border>
+                        </ControlTemplate>
+                    </Button.Template>
+                </Button>
+                <Button x:Name="UserResetPassBtn" Content="密码重置" BorderThickness="1" HorizontalAlignment="Left" Margin="5,10,5,0" VerticalAlignment="Top" Width="100" Height="40" Background="#B20123FF" FontWeight="Bold" FontSize="20" Foreground="White" Click="UserResetPassBtn_Click" Cursor="Hand">
+                    <Button.Template>
+                        <ControlTemplate TargetType="Button">
+                            <Border CornerRadius="5" 
+                        Background="{TemplateBinding Background}"
+                        BorderBrush="{TemplateBinding BorderBrush}"
+                        BorderThickness="{TemplateBinding BorderThickness}">
+                                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                            </Border>
+                        </ControlTemplate>
+                    </Button.Template>
+                </Button>
+                <Button x:Name="UserCancelBtn" Content="取消" BorderThickness="1" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="80" Height="40" Background="#B20123FF" FontWeight="Bold" FontSize="20" Foreground="White" Click="UserCancelBtn_Click" Cursor="Hand">
+                    <Button.Template>
+                        <ControlTemplate TargetType="Button">
+                            <Border CornerRadius="5" 
+                                            Background="{TemplateBinding Background}"
+                                            BorderBrush="{TemplateBinding BorderBrush}"
+                                            BorderThickness="{TemplateBinding BorderThickness}">
+                                <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                            </Border>
+                        </ControlTemplate>
+                    </Button.Template>
+                </Button>
+            </StackPanel>
+        </StackPanel>
+    </Grid>
+</Window>

+ 89 - 0
CCDCountWpf/WpfFrom/ChangeUserWindow.xaml.cs

@@ -0,0 +1,89 @@
+using CCDCount.MODEL.SqlDataModel;
+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;
+
+namespace CCDCountWpf.WpfFrom
+{
+    /// <summary>
+    /// ChangeUserWindow.xaml 的交互逻辑
+    /// </summary>
+    public partial class ChangeUserWindow : Window
+    {
+        public UserMesDataModelClass UserMessage = null;
+        public ChangeUserWindow()
+        {
+            InitializeComponent();
+        }
+
+        private void UserCancelBtn_Click(object sender, RoutedEventArgs e)
+        {
+            this.Close();
+        }
+
+        private void UserChangeBtn_Click(object sender, RoutedEventArgs e)
+        {
+            if (UserMessage == null) return;
+            if (UserNameTbx.Text == "" || UserOldPassTbx.Password == "" || UserNewPassTbx.Password == "" 
+                || UserReNewPassTbx.Password == "" || UserLevelCbx.SelectedItem == null)
+            {
+                MessageBox.Show("请将信息填写完整");
+                return;
+            }
+            if (MessageBus.UserMessageClass.HashPassword(UserOldPassTbx.Password) != UserMessage.PassWord)
+            {
+                MessageBox.Show("旧密码输入错误");
+                return;
+            }
+            if (UserOldPassTbx.Password != UserNewPassTbx.Password)
+            {
+                MessageBox.Show("新密码输入不一致");
+                return;
+            }
+            UserMesDataModelClass newUserMessage = new UserMesDataModelClass()
+            {
+                Id = UserMessage.Id,
+                UserName = UserNameTbx.Text,
+                PassWord = UserNewPassTbx.Password,
+                IsDelete = UserMessage.IsDelete,
+                IsAdmin = UserLevelCbx.SelectedItem.ToString() == "管理员" ? true : false,
+                UserMes = UserLevelCbx.SelectedItem.ToString()
+            };
+            MessageBus.UserMessageClass.ChangeUserMessage(UserMessage.Id, newUserMessage);
+            MessageBus.ShowBinding.UserMesDataModels = MessageBus.UserMessageClass.GetAllUserMessage();
+            MessageBox.Show("修改成功");
+            this.Close();
+        }
+
+        private void UserResetPassBtn_Click(object sender, RoutedEventArgs e)
+        {
+            if(UserMessage == null) return;
+            var confirmResult = MessageBox.Show($"继续执行此操作将会重置用户{UserMessage.UserName}的密码至默认的\"123456\",是否继续执行",
+                                      "执行确认", MessageBoxButton.YesNo);
+            if (confirmResult == MessageBoxResult.No)
+            {
+                return;
+            }
+            MessageBus.UserMessageClass.ResetPassWord(UserMessage.Id);
+            MessageBus.UserMessageClass.ChangePassWord(UserMessage.Id, UserOldPassTbx.Password, UserNewPassTbx.Password);
+        }
+
+        private void Window_Loaded(object sender, RoutedEventArgs e)
+        {
+            UserLevelCbx.Items.Add("管理员");
+            UserLevelCbx.Items.Add("普通用户");
+            UserLevelCbx.SelectedItem = UserMessage.IsAdmin ? "管理员" : "普通用户";
+            UserIDTbx.Text = UserMessage.Id.ToString();
+        }
+    }
+}

+ 15 - 3
CCDCountWpf/MainWindow.xaml → CCDCountWpf/WpfFrom/MainWindow.xaml

@@ -5,7 +5,7 @@
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:local="clr-namespace:CCDCountWpf"
         mc:Ignorable="d"
-        Title="MainWindow" Height="720" Width="820" MinWidth="900" MinHeight="720" Closing="Window_Closing">
+        Title="MainWindow" Height="720" Width="820" MinWidth="900" MinHeight="720" Closing="Window_Closing" WindowStartupLocation="CenterScreen" Icon="/FromImage/mmexport1752891278116.jpg">
     <Grid Background="#B2E0E0E0">
         <Grid  x:Name="HeardGrid" Height="60" VerticalAlignment="Top" Background="#B20092FF">
             <Grid.ColumnDefinitions>
@@ -24,13 +24,25 @@
                         <TextBlock Text="主界面" FontSize="10" FontWeight="Bold" Margin="0,5,0,0" HorizontalAlignment="Center" />
                     </StackPanel>
                 </Button>
-            <Button HorizontalAlignment="Left" Height="60" Width="60" Margin="120,0,0,0" Background="{x:Null}" Click="Button_Click">
+            <Button x:Name="SettingBtn" HorizontalAlignment="Left" Height="60" Width="60" Margin="120,0,0,0" Background="{x:Null}" Click="SettingBtn_Click">
                     <StackPanel Orientation="Vertical" HorizontalAlignment="Center">
                         <Image  Source="/FromImage/设置.png" Width="32" Height="32" />
                         <TextBlock Text="设置界面" FontSize="10" FontWeight="Bold" Margin="0,5,0,0" HorizontalAlignment="Center" />
                     </StackPanel>
                 </Button>
-            <Button x:Name="RnIdentifyBtn" HorizontalAlignment="Left" Height="60" Width="60" Margin="180,0,0,0" Background="{x:Null}" Click="RnIdentifyBtn_Click">
+            <Button x:Name="ErrorMessageShowBtn" HorizontalAlignment="Left" Height="60" Width="60" Margin="180,0,0,0" Background="{x:Null}" Click="ErrorMessageShowBtn_Click">
+                <StackPanel Orientation="Vertical" HorizontalAlignment="Center">
+                    <Image  Source="/FromImage/故障.png" Width="36" Height="36" />
+                    <TextBlock Text="故障页面" FontSize="10" FontWeight="Bold" Margin="0,0,0,0" HorizontalAlignment="Center" />
+                </StackPanel>
+            </Button>
+            <Button x:Name="UserMessageBtn" HorizontalAlignment="Left" Height="60" Width="60" Margin="240,0,0,0" Background="{x:Null}" Click="UserMessageBtn_Click">
+                <StackPanel Orientation="Vertical" HorizontalAlignment="Center">
+                    <Image  Source="/FromImage/用户管理.png" Width="32" Height="32" />
+                    <TextBlock Text="用户管理" FontSize="10" FontWeight="Bold" Margin="0,4,0,0" HorizontalAlignment="Center" />
+                </StackPanel>
+            </Button>
+            <Button x:Name="RnIdentifyBtn" HorizontalAlignment="Left" Height="60" Width="60" Margin="300,0,0,0" Background="{x:Null}" Click="RnIdentifyBtn_Click">
                 <StackPanel Orientation="Vertical" HorizontalAlignment="Center">
                     <Image Name="RnIdentifyBtn_Image"  Source="/FromImage/运行.png" Width="32" Height="32" />
                     <TextBlock Name="RnIdentifyBtn_Text" Text="开始运行" FontSize="10" FontWeight="Bold" Margin="0,5,0,0" HorizontalAlignment="Center" />

+ 62 - 48
CCDCountWpf/MainWindow.xaml.cs → CCDCountWpf/WpfFrom/MainWindow.xaml.cs

@@ -17,20 +17,6 @@ using System.Windows.Media.Imaging;
 
 namespace CCDCountWpf
 {
-    public static class MessageBus
-    {
-        public static List<MainThreadClass> MainThreadS = new List<MainThreadClass>();
-
-        public static MainThreadClass NowSettingLoadMainThread = null;
-
-        public static ShowBindingClass ShowBinding = new ShowBindingClass();
-
-        public static CameraClass CameraClass = new CameraClass();
-
-        public static string NowLoadCammeraSN = string.Empty;
-        public static int SeetingNowLoadInMaThreadsIndex = -1;
-        public static int NowLoadCameraIndex = -1;
-    }
     /// <summary>
     /// MainWindow.xaml 的交互逻辑
     /// </summary>
@@ -52,8 +38,11 @@ namespace CCDCountWpf
         {
             InitializeComponent();
             DataContext = MessageBus.ShowBinding;
-            //modbusTcpClient.Connect("192.168.1.88");
-            modbusTcpClient.Connect("127.0.0.1");
+            //if(!modbusTcpClient.Connect("192.168.1.88"))
+            if (!modbusTcpClient.Connect("127.0.0.1"))
+            {
+                MessageBus.faultLogClass.RecordErrorMessage("Modbus通讯连接失败", MessageBus.NowLoginUserMessage!=null?MessageBus.NowLoginUserMessage.Id:-1);
+            }
             if (File.Exists(".\\Config\\CCDCountConfig.xml"))
             {
                 Configs = XmlStorage.DeserializeFromXml<List<SaveConfigModel>>(".\\Config\\CCDCountConfig.xml");
@@ -108,6 +97,36 @@ namespace CCDCountWpf
             }
         }
 
+        private void SettingBtn_Click(object sender, RoutedEventArgs e)
+        {
+            ShowUri = new Uri("WpfPage\\SettingPage.xaml", UriKind.Relative);
+            ShowFrame.Navigate(ShowUri);
+        }
+
+        private void ErrorMessageShowBtn_Click(object sender, RoutedEventArgs e)
+        {
+            ShowUri = new Uri("WpfPage\\MessagePage.xaml", UriKind.Relative);
+            ShowFrame.Navigate(ShowUri);
+        }
+        private void UserMessageBtn_Click(object sender, RoutedEventArgs e)
+        {
+            if (MessageBus.NowLoginUserMessage != null)
+            {
+                if (MessageBus.NowLoginUserMessage.Id != 1)
+                {
+                    MessageBox.Show("权限不足");
+                }
+                else
+                {
+                    ShowUri = new Uri("WpfPage\\UserManagementPage.xaml", UriKind.Relative);
+                    ShowFrame.Navigate(ShowUri);
+                }
+            }
+            else
+            {
+                MessageBox.Show("请先登录");
+            }
+        }
         /// <summary>
         /// 窗体关闭事件
         /// </summary>
@@ -148,7 +167,7 @@ namespace CCDCountWpf
                 MessageBus.MainThreadS.Add(new MainThreadClass(Configs[i].ShuLiConfigClass, Configs[i].CameraConfig));
 
                 MessageBus.MainThreadS[i].SetModbusClient(modbusTcpClient);
-                MessageBus.MainThreadS[i].loadCamera();
+                MessageBus.MainThreadS[i].LoadCamera();
             }
         }
 
@@ -159,9 +178,14 @@ namespace CCDCountWpf
         {
             for (int i = 0; i < MessageBus.MainThreadS.Count; i++)
             {
+                if(MessageBus.MainThreadS[i].CameraConfigIsChange)
+                {
+                    MessageBus.MainThreadS[i].ReLoadCameraConfig();
+                }
                 //启动单相机实例的全部线程
                 if (!MessageBus.MainThreadS[i].StartMianThread())
                 {
+                    MessageBus.faultLogClass.RecordErrorMessage(MessageBus.MainThreadS[i].cameraConfig.DeviceName + "_" + MessageBus.MainThreadS[i].cameraConfig.CameraSNNum + "启动失败", MessageBus.NowLoginUserMessage.Id);
                     LOG.error(MessageBus.MainThreadS[i].cameraConfig.DeviceName + "_" + MessageBus.MainThreadS[i].cameraConfig.CameraSNNum + "启动失败");
                     MessageBox.Show(MessageBus.MainThreadS[i].cameraConfig.DeviceName + "_" + MessageBus.MainThreadS[i].cameraConfig.CameraSNNum + "启动失败");
                     continue;
@@ -191,7 +215,7 @@ namespace CCDCountWpf
         /// <summary>
         ///  启动更新显示数据线程
         /// </summary>
-        private void StartUpdataShowDataThread()
+        private  void StartUpdataShowDataThread()
         {
             IsShow = true;
             Bitmap image1 = null;
@@ -200,13 +224,18 @@ namespace CCDCountWpf
             Bitmap image4 = null;
             const int targetMsPerFrame = 100; // 20FPS=50ms
             Stopwatch renderSW = new Stopwatch();
-            Task.Run(() =>
+            Task.Run(async () =>
             {
                 while (IsShow)
                 {
                     renderSW.Restart();
-                    UpdataShuLiShowData();
-                    UpdateMonitorMessage();
+                    await Task.Run(() =>
+                    {
+                        UpdataShuLiShowData();
+                        UpdateMonitorMessage();
+                        UpdateFaultLogMessage();
+                    });
+
                     if (MessageBus.MainThreadS.Count == 0)
                     {
                         LOG.log(string.Format("{0}:当前未加载识别流程", "IdentifyCameraForm-StartShowImageThread"));
@@ -264,24 +293,7 @@ namespace CCDCountWpf
                         }
                     }
 
-                    if (MessageBus.MainThreadS.Count >= 4)
-                    {
-                        if (MessageBus.MainThreadS[3].HistoryActiveNum > 0)
-                        {
-                            MessageBus.MainThreadS[3].GetShowImage(2000, out image4);
-                        }
-                        else
-                        {
-                            MessageBus.MainThreadS[3].GetNullShowImage(4096, 2000, out image4);
-                        }
-                        if (image4 == null)
-                        {
-                            LOG.log(string.Format("{0}:相机三获取图片为空", "IdentifyCameraForm-StartShowImageThread"));
-                            continue;
-                        }
-                    }
-
-                    Application.Current.Dispatcher.BeginInvoke(new Action(() =>
+                    await Application.Current.Dispatcher.InvokeAsync(() =>
                     {
                         BitmapImage thumbnailImage1 = null;
                         BitmapImage thumbnailImage2 = null;
@@ -323,7 +335,7 @@ namespace CCDCountWpf
                         {
                             MessageBus.ShowBinding.BitmapImage = thumbnailImage4;
                         }
-                    }));
+                    });
                     //进行精准20帧控制
                     int elapsed = (int)renderSW.ElapsedMilliseconds;
                     //Console.WriteLine(elapsed);
@@ -382,8 +394,16 @@ namespace CCDCountWpf
         /// </summary>
         private void UpdateMonitorMessage()
         {
-            MessageBus.ShowBinding.RamMonitor = monitor.GetAvailableMemory() > 1024 ? $"可用内存: {(monitor.GetAvailableMemory() / 1024).ToString("0.00")}GB" : $"可用内存: {monitor.GetAvailableMemory()}MB";
-            MessageBus.ShowBinding.CPUMonitor = $"CPU: {monitor.GetCpuUsage().ToString("0.00")}%";
+            MessageBus.ShowBinding.RamMonitor = monitor.GetAvailableMemory() > 1024 ? $"可用内存: {monitor.GetAvailableMemory() / 1024:0.00}GB" : $"可用内存: {monitor.GetAvailableMemory()}MB";
+            MessageBus.ShowBinding.CPUMonitor = $"CPU: {monitor.GetCpuUsage():0.00}%";
+        }
+
+        /// <summary>
+        /// 更新故障日志信息
+        /// </summary>
+        private void UpdateFaultLogMessage()
+        {
+            MessageBus.ShowBinding.ErrMessageShowList = MessageBus.faultLogClass.GetAllErrMessage();
         }
 
         // Bitmap 转 BitmapImage 的辅助方法
@@ -421,11 +441,5 @@ namespace CCDCountWpf
             }
         }
         #endregion
-
-        private void Button_Click(object sender, RoutedEventArgs e)
-        {
-            ShowUri = new Uri("WpfPage\\SettingPage.xaml", UriKind.Relative);
-            ShowFrame.Navigate(ShowUri);
-        }
     }
 }

+ 18 - 0
CCDCountWpf/WpfFrom/SplashWindow.xaml

@@ -0,0 +1,18 @@
+<Window x:Class="CCDCountWpf.SplashWindow"
+        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:CCDCountWpf"
+        mc:Ignorable="d"
+        Title="SplashWindow" Height="450" Width="800" 
+        WindowStyle="None" AllowsTransparency="True"
+        Background="Transparent" WindowStartupLocation="CenterScreen" Icon="/FromImage/mmexport1752891278116.jpg">
+    <Grid Background="White">
+        <TextBlock Text="翰林航宇视觉数粒系统" HorizontalAlignment="Center" 
+                           Foreground="#FF0072BF" FontSize="40" VerticalAlignment="Top" Cursor="Arrow" Margin="0,20,0,0"/>
+        <Image Source="/FromImage/mmexport1752891278116.jpg" Stretch="Fill" Width="200" Height="200" Cursor="Arrow"/>
+        <TextBlock Text="程序启动中" HorizontalAlignment="Right" Margin="0,0,60,20" 
+                           Foreground="#FF0072BF" FontSize="40" VerticalAlignment="Bottom" Cursor="Arrow"/>
+    </Grid>
+</Window>

+ 27 - 0
CCDCountWpf/WpfFrom/SplashWindow.xaml.cs

@@ -0,0 +1,27 @@
+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;
+
+namespace CCDCountWpf
+{
+    /// <summary>
+    /// SplashWindow.xaml 的交互逻辑
+    /// </summary>
+    public partial class SplashWindow : Window
+    {
+        public SplashWindow()
+        {
+            InitializeComponent();
+        }
+    }
+}

+ 62 - 0
CCDCountWpf/WpfFrom/UserLoginWindow.xaml

@@ -0,0 +1,62 @@
+<Window x:Class="CCDCountWpf.UserLoginWindow"
+        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:CCDCountWpf"
+        mc:Ignorable="d"
+        Title="UserLoginWindow" Height="300" Width="450"
+        WindowStyle="None" AllowsTransparency="True"
+        WindowStartupLocation="CenterScreen" Icon="/FromImage/mmexport1752891278116.jpg" KeyDown="Window_KeyDown">
+    <Grid Background="#B2E0E0E0">
+        <Grid VerticalAlignment="Top" Height="50" Background="#B20092FF">
+            <Border BorderBrush="Black" BorderThickness="1"/>
+            <Label Content="用户登录" Foreground="Black" FontSize="20" VerticalAlignment="Center" HorizontalAlignment="Center"/>
+        </Grid>
+        <Border  Background="#B20092FF" 
+                    CornerRadius="8"
+                    BorderBrush="Gray"
+                    BorderThickness="1"
+                    Margin="80,120,80,0" Height="155" VerticalAlignment="Top">
+            <StackPanel Orientation="Vertical">
+                <StackPanel Orientation="Horizontal" Height="95">
+                    <StackPanel Orientation="Vertical" Margin="30,0,0,0">
+                        <Label  Content="用户名:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="20"/>
+                        <Label  Content="密码:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" FontWeight="Bold" FontSize="20"/>
+                    </StackPanel>
+                    <StackPanel Orientation="Vertical">
+                        <TextBox x:Name="UserNameTbx" HorizontalAlignment="Left" Margin="0,15,0,0"  Width="120" FontWeight="Bold" FontSize="20" Background="{x:Null}"/>
+                        <PasswordBox x:Name="UserPassTbx"  HorizontalAlignment="Left" Margin="0,17,0,0" VerticalAlignment="Top" Width="120" FontWeight="Bold" FontSize="20" Background="{x:Null}"  />
+                    </StackPanel>
+                </StackPanel>
+                <StackPanel Orientation="Horizontal">
+                    <Button x:Name="UserLoginBtn" Content="登录" BorderThickness="1" HorizontalAlignment="Left" Margin="50,10,10,0" VerticalAlignment="Top" Width="80" Height="40" Background="#B20123FF" FontWeight="Bold" FontSize="20" Foreground="White" Click="UserLoginBtn_Click" Cursor="Hand">
+                        <Button.Template>
+                            <ControlTemplate TargetType="Button">
+                                <Border CornerRadius="5" 
+                                            Background="{TemplateBinding Background}"
+                                            BorderBrush="{TemplateBinding BorderBrush}"
+                                            BorderThickness="{TemplateBinding BorderThickness}">
+                                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                                </Border>
+                            </ControlTemplate>
+                        </Button.Template>
+                    </Button>
+                    <Button x:Name="UserCancelBtn" Content="取消" BorderThickness="1" HorizontalAlignment="Left" Margin="10,10,10,0" VerticalAlignment="Top" Width="80" Height="40" Background="#B20123FF" FontWeight="Bold" FontSize="20" Foreground="White" Click="UserCancelBtn_Click" Cursor="Hand">
+                        <Button.Template>
+                            <ControlTemplate TargetType="Button">
+                                <Border CornerRadius="5" 
+                                            Background="{TemplateBinding Background}"
+                                            BorderBrush="{TemplateBinding BorderBrush}"
+                                            BorderThickness="{TemplateBinding BorderThickness}">
+                                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
+                                </Border>
+                            </ControlTemplate>
+                        </Button.Template>
+                    </Button>
+                </StackPanel>
+            </StackPanel>
+            <!-- 卡片内容 -->
+        </Border>
+    </Grid>
+</Window>

+ 60 - 0
CCDCountWpf/WpfFrom/UserLoginWindow.xaml.cs

@@ -0,0 +1,60 @@
+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;
+
+namespace CCDCountWpf
+{
+    /// <summary>
+    /// UserLoginWindow.xaml 的交互逻辑
+    /// </summary>
+    public partial class UserLoginWindow : Window
+    {
+        public UserLoginWindow()
+        {
+            InitializeComponent();
+        }
+
+        private void UserLoginBtn_Click(object sender, RoutedEventArgs e)
+        {
+            if(!MessageBus.UserMessageClass.CheckUserLogin(UserNameTbx.Text, UserPassTbx.Password))
+            {
+                MessageBox.Show("用户名或密码错误!");
+                return;
+            }
+            MessageBus.NowLoginUserMessage = MessageBus.UserMessageClass.GetUserMessageForName(UserNameTbx.Text)[0];
+            SplashWindow splash = new SplashWindow();
+            splash.Show();
+            this.Close();
+
+            MainWindow mainWindow = new MainWindow();
+            mainWindow.Show();
+            splash.Close();
+        }
+
+        private void UserCancelBtn_Click(object sender, RoutedEventArgs e)
+        {
+            this.Close();
+            Environment.Exit(0);
+        }
+
+        private void Window_KeyDown(object sender, KeyEventArgs e)
+        {
+            if (e.Key == Key.Enter)
+            {
+                // 触发目标按钮的点击事件
+                UserLoginBtn.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
+                e.Handled = true; // 标记事件已处理
+            }
+        }
+    }
+}

+ 1 - 1
CCDCountWpf/WpfPage/MainPage.xaml

@@ -52,7 +52,7 @@
                     </StackPanel>
                     <StackPanel Orientation="Vertical">
                         <Label x:Name="CamRunStaticLab" Content="{Binding CamRunStatic}" HorizontalAlignment="Right" Margin="10,5,10,0" VerticalAlignment="Top" Background="{x:Null}" FontSize="25" Foreground="{Binding CameraStaticColor}" FontWeight="Bold" />
-                        <Button x:Name="DataClear" Content="清零" BorderThickness="1" HorizontalAlignment="Left" Margin="10,50,10,0" VerticalAlignment="Top" Width="80" Height="40" Background="#B20123FF" FontWeight="Bold" FontSize="20" Foreground="White" Click="DataClear_Click">
+                        <Button x:Name="DataClear" Content="清零" BorderThickness="1" HorizontalAlignment="Left" Margin="10,50,10,0" VerticalAlignment="Top" Width="80" Height="40" Background="#B20123FF" FontWeight="Bold" FontSize="20" Foreground="White" Click="DataClear_Click" Cursor="Hand">
                             <Button.Template>
                                 <ControlTemplate TargetType="Button">
                                     <Border CornerRadius="5" 

+ 23 - 0
CCDCountWpf/WpfPage/MessagePage.xaml

@@ -0,0 +1,23 @@
+<Page x:Class="CCDCountWpf.WpfPage.MessagePage"
+      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+      xmlns:local="clr-namespace:CCDCountWpf.WpfPage"
+      mc:Ignorable="d" 
+      d:DesignHeight="450" d:DesignWidth="800"
+      Title="MessagePage">
+
+    <Grid>
+        <DataGrid ItemsSource="{Binding ErrMessageShowList}" AutoGenerateColumns="False">
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="编号" Binding="{Binding Number}" />
+                <DataGridTextColumn Header="类别" Binding="{Binding Category}" />
+                <DataGridTextColumn Header="类型" Binding="{Binding MessageType}" />
+                <DataGridTextColumn Header="消息文本" Binding="{Binding Message}" />
+                <DataGridTextColumn Header="时间" Binding="{Binding DateTime}" />
+                <DataGridTextColumn Header="用户ID" Binding="{Binding UserID}" />
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+</Page>

+ 29 - 0
CCDCountWpf/WpfPage/MessagePage.xaml.cs

@@ -0,0 +1,29 @@
+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.Navigation;
+using System.Windows.Shapes;
+
+namespace CCDCountWpf.WpfPage
+{
+    /// <summary>
+    /// MessagePage.xaml 的交互逻辑
+    /// </summary>
+    public partial class MessagePage : Page
+    {
+        public MessagePage()
+        {
+            InitializeComponent();
+            DataContext = MessageBus.ShowBinding;
+        }
+    }
+}

+ 7 - 7
CCDCountWpf/WpfPage/SettingPage.xaml.cs

@@ -156,7 +156,7 @@ namespace CCDCountWpf.WpfPage
         private void CamSelectConBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
         {
             if(MessageBus.ShowBinding.CameraItems.Count == 0) return;
-            string ThisItemSN = MessageBus.ShowBinding.SelectedCameraSN;
+            string ThisItemSN = MessageBus.ShowBinding.CameraSNNum;
             if (MessageBus.NowSettingLoadMainThread == null || ThisItemSN == MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum) return;
             if (ThisItemSN != string.Empty && ThisItemSN != null)
             {
@@ -180,7 +180,7 @@ namespace CCDCountWpf.WpfPage
                     MessageBus.ShowBinding.CamOffsetX = MessageBus.NowSettingLoadMainThread.cameraConfig.OffsetX.ToString();
                     MessageBus.ShowBinding.ExposureTimeValue = MessageBus.NowSettingLoadMainThread.cameraConfig.ExposureTimeValue.ToString();
                     MessageBus.ShowBinding.AcquistionLineRate = MessageBus.NowSettingLoadMainThread.cameraConfig.AcquistionLineRateValue.ToString();
-                    MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum = ThisItemSN;
+                    MessageBus.ShowBinding.CameraSNNum = ThisItemSN;
                 }
                 else
                 {
@@ -212,34 +212,34 @@ namespace CCDCountWpf.WpfPage
                 MessageBus.ShowBinding.CamOffsetX = "0";
                 MessageBus.ShowBinding.ExposureTimeValue = "0";
                 MessageBus.ShowBinding.AcquistionLineRate = "0";
-                MessageBus.NowSettingLoadMainThread.cameraConfig.CameraSNNum = null;
+                MessageBus.ShowBinding.CameraSNNum = null;
             }
         }
 
         private void CheckModel1RadBtn_Checked(object sender, RoutedEventArgs e)
         {
-            MessageBus.NowSettingLoadMainThread.shuLiConfig.PandingCode = -1;
+            MessageBus.ShowBinding.PandingCode = "-1";
             WHParaPanel.Visibility = Visibility.Collapsed;
             AreaParaPanel.Visibility = Visibility.Collapsed;
         }
 
         private void CheckModel2RadBtn_Checked(object sender, RoutedEventArgs e)
         {
-            MessageBus.NowSettingLoadMainThread.shuLiConfig.PandingCode = 0;
+            MessageBus.ShowBinding.PandingCode = "0";
             WHParaPanel.Visibility = Visibility.Visible;
             AreaParaPanel.Visibility = Visibility.Collapsed;
         }
 
         private void CheckModel3RadBtn_Checked(object sender, RoutedEventArgs e)
         {
-            MessageBus.NowSettingLoadMainThread.shuLiConfig.PandingCode = 1;
+            MessageBus.ShowBinding.PandingCode = "1";
             WHParaPanel.Visibility = Visibility.Collapsed;
             AreaParaPanel.Visibility = Visibility.Visible;
         }
 
         private void CheckModel4RadBtn_Checked(object sender, RoutedEventArgs e)
         {
-            MessageBus.NowSettingLoadMainThread.shuLiConfig.PandingCode = 2;
+            MessageBus.ShowBinding.PandingCode = "2";
             WHParaPanel.Visibility = Visibility.Visible;
             AreaParaPanel.Visibility = Visibility.Visible;
         }

+ 51 - 0
CCDCountWpf/WpfPage/UserManagementPage.xaml

@@ -0,0 +1,51 @@
+<Page x:Class="CCDCountWpf.WpfPage.UserManagementPage"
+      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+      xmlns:local="clr-namespace:CCDCountWpf.WpfPage"
+      mc:Ignorable="d" 
+      d:DesignHeight="450" d:DesignWidth="800"
+      Title="UserManagementPage">
+    <Grid>
+        <Grid Height="30" VerticalAlignment="Top">
+            <StackPanel Orientation="Horizontal">
+                <Button x:Name="AddUserBtn" HorizontalAlignment="Left" Height="25" Width="25" Background="{x:Null}" Click="AddUserBtn_Click">
+                    <StackPanel Orientation="Vertical">
+                        <Image  Source="/FromImage/用户增加.png"/>
+                    </StackPanel>
+                </Button>
+                <Button x:Name="DeleteUserBtn" HorizontalAlignment="Left" Height="25" Width="25" Background="{x:Null}" Click="DeleteUserBtn_Click">
+                    <StackPanel Orientation="Vertical">
+                        <Image  Source="/FromImage/用户删除.png"/>
+                    </StackPanel>
+                </Button>
+                <Button x:Name="ChangeUserBtn" HorizontalAlignment="Left" Height="25" Width="25" Background="{x:Null}" Click="ChangeUserBtn_Click">
+                    <StackPanel Orientation="Vertical">
+                        <Image  Source="/FromImage/用户修改.png"/>
+                    </StackPanel>
+                </Button>
+            </StackPanel>
+        </Grid>
+        <DataGrid x:Name="UserMessageDataGrid" ItemsSource="{Binding UserMesDataModels}" AutoGenerateColumns="False" Margin="0,30,0,0" SelectionMode="Single"
+            SelectionUnit="FullRow" SelectionChanged="DataGrid_SelectionChanged">
+            <!-- 添加行样式 -->
+            <DataGrid.RowStyle>
+                <Style TargetType="DataGridRow">
+                    <Style.Triggers>
+                        <Trigger Property="IsSelected" Value="True">
+                            <!-- 设置蓝色背景和白色文字 -->
+                            <Setter Property="Background" Value="DodgerBlue"/>
+                            <Setter Property="Foreground" Value="White"/>
+                        </Trigger>
+                    </Style.Triggers>
+                </Style>
+            </DataGrid.RowStyle>
+            <DataGrid.Columns>
+                <DataGridTextColumn Header="ID" Binding="{Binding Id}" />
+                <DataGridTextColumn Header="用户名" Binding="{Binding UserName}" />
+                <DataGridTextColumn Header="用户信息" Binding="{Binding UserMes}" />
+            </DataGrid.Columns>
+        </DataGrid>
+    </Grid>
+</Page>

+ 71 - 0
CCDCountWpf/WpfPage/UserManagementPage.xaml.cs

@@ -0,0 +1,71 @@
+using CCDCount.MODEL.SqlDataModel;
+using CCDCountWpf.WpfFrom;
+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.Navigation;
+using System.Windows.Shapes;
+
+namespace CCDCountWpf.WpfPage
+{
+    /// <summary>
+    /// UserManagementPage.xaml 的交互逻辑
+    /// </summary>
+    public partial class UserManagementPage : Page
+    {
+        UserMesDataModelClass SelectUserMessage = null;
+        public UserManagementPage()
+        {
+            InitializeComponent();
+            DataContext = MessageBus.ShowBinding;
+            MessageBus.ShowBinding.UserMesDataModels = MessageBus.UserMessageClass.GetAllUserMessage();
+        }
+
+        private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
+        {
+            var selectedItem = UserMessageDataGrid.SelectedItem as UserMesDataModelClass; // 替换为实际数据类型
+            if (selectedItem != null)
+            {
+                SelectUserMessage = selectedItem;
+            }
+        }
+
+        private void ChangeUserBtn_Click(object sender, RoutedEventArgs e)
+        {
+            if (SelectUserMessage == null)
+            {
+                MessageBox.Show("请选择用户");
+                return;
+            }
+            ChangeUserWindow changeUserWindow = new ChangeUserWindow();
+            changeUserWindow.UserMessage = SelectUserMessage;
+            changeUserWindow.ShowDialog();
+        }
+
+        private void DeleteUserBtn_Click(object sender, RoutedEventArgs e)
+        {
+            if (SelectUserMessage == null)
+            {
+                MessageBox.Show("请选择用户");
+                return;
+            }
+            MessageBus.UserMessageClass.DeleteUserMessage(SelectUserMessage.Id);
+            MessageBus.ShowBinding.UserMesDataModels = MessageBus.UserMessageClass.GetAllUserMessage();
+        }
+
+        private void AddUserBtn_Click(object sender, RoutedEventArgs e)
+        {
+            AddUserWindow addUserWindow = new AddUserWindow();
+            addUserWindow.ShowDialog();
+        }
+    }
+}

+ 9 - 0
CCDCountWpf/packages.config

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="EntityFramework" version="6.4.4" targetFramework="net48" />
+  <package id="Stub.System.Data.SQLite.Core.NetFramework" version="1.0.119.0" targetFramework="net48" />
+  <package id="System.Data.SQLite" version="1.0.119.0" targetFramework="net48" />
+  <package id="System.Data.SQLite.Core" version="1.0.119.0" targetFramework="net48" />
+  <package id="System.Data.SQLite.EF6" version="1.0.119.0" targetFramework="net48" />
+  <package id="System.Data.SQLite.Linq" version="1.0.119.0" targetFramework="net48" />
+</packages>

+ 32 - 1
TestWork.DLL/CCDCount.DLL.csproj

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="..\packages\EntityFramework.6.4.4\build\EntityFramework.props" Condition="Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.props')" />
   <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -12,6 +13,8 @@
     <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <Deterministic>true</Deterministic>
+    <NuGetPackageImportStamp>
+    </NuGetPackageImportStamp>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -35,6 +38,12 @@
     <Reference Include="CsvHelper, Version=33.0.0.0, Culture=neutral, PublicKeyToken=8c4959082be5c823, processorArchitecture=MSIL">
       <HintPath>..\packages\CsvHelper.33.0.1\lib\net48\CsvHelper.dll</HintPath>
     </Reference>
+    <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+      <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.dll</HintPath>
+    </Reference>
+    <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
+      <HintPath>..\packages\EntityFramework.6.4.4\lib\net45\EntityFramework.SqlServer.dll</HintPath>
+    </Reference>
     <Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
     </Reference>
@@ -53,7 +62,17 @@
     <Reference Include="System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
       <HintPath>..\packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll</HintPath>
     </Reference>
+    <Reference Include="System.ComponentModel.DataAnnotations" />
     <Reference Include="System.Core" />
+    <Reference Include="System.Data.SQLite, Version=1.0.119.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
+      <HintPath>..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.119.0\lib\net46\System.Data.SQLite.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data.SQLite.EF6, Version=1.0.119.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Data.SQLite.EF6.1.0.119.0\lib\net46\System.Data.SQLite.EF6.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data.SQLite.Linq, Version=1.0.119.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.Data.SQLite.Linq.1.0.119.0\lib\net46\System.Data.SQLite.Linq.dll</HintPath>
+    </Reference>
     <Reference Include="System.Drawing" />
     <Reference Include="System.Memory, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
       <HintPath>..\packages\System.Memory.4.5.0\lib\netstandard2.0\System.Memory.dll</HintPath>
@@ -79,7 +98,9 @@
     <Compile Include="BottingClass.cs" />
     <Compile Include="CameraClass.cs" />
     <Compile Include="Delta\DeltaClass.cs" />
+    <Compile Include="FaultLogClass.cs" />
     <Compile Include="MechanicalControlClass.cs" />
+    <Compile Include="SqlDataClass\UserMessSqliteDataClass.cs" />
     <Compile Include="Tools\IniFileClass.cs" />
     <Compile Include="Tools\LoadSplieImageClass.cs" />
     <Compile Include="Tools\LogClass.cs" />
@@ -89,7 +110,7 @@
     <Compile Include="Delta\EtherCAT_DLL.cs" />
     <Compile Include="Delta\EtherCAT_DLL_Err.cs" />
     <Compile Include="Tools\ModbusClass.cs" />
-    <Compile Include="Tools\SqliteDataClass.cs" />
+    <Compile Include="SqlDataClass\ErrorMesSqliteDataClass.cs" />
     <Compile Include="Tools\SystemMonitorClass.cs" />
     <Compile Include="Tools\XMLFileClass.cs" />
     <Compile Include="ZhengYunDong\Zmcaux.cs" />
@@ -112,4 +133,14 @@
     <None Include="packages.config" />
   </ItemGroup>
   <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\EntityFramework.6.4.4\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.props'))" />
+    <Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.targets'))" />
+    <Error Condition="!Exists('..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.119.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.119.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets'))" />
+  </Target>
+  <Import Project="..\packages\EntityFramework.6.4.4\build\EntityFramework.targets" Condition="Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" />
+  <Import Project="..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.119.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets" Condition="Exists('..\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.119.0\build\net46\Stub.System.Data.SQLite.Core.NetFramework.targets')" />
 </Project>

+ 52 - 15
TestWork.DLL/CameraClass.cs

@@ -27,10 +27,7 @@ namespace CCDCount.DLL
 
         private List<IDeviceInfo> CamList;      // 相机列表
         private IDevice device = null;          // 相机实例
-        private Thread receiveThread = null;    // 接收图像线程
         private ConcurrentQueue<IFrameOut> FrameOuts = new ConcurrentQueue<IFrameOut>();
-        private ConcurrentQueue<byte[]> ImageBytes = new ConcurrentQueue<byte[]>(); //图像接受队列
-        private int OnImageSelectRows = 20;
         private long lastframeNum = -1;
 
         public int CamereNo { get { return _cameraNo; } }
@@ -91,6 +88,12 @@ namespace CCDCount.DLL
         public bool LoadCamereDevice(CameraConfig DeviceConfig)
         {
             bool Blresult = false;
+            if (device != null && device.IsConnected)
+            {
+                device.Close();
+                device.Dispose();
+            }
+            UpdateCameraList();
             List<IDeviceInfo> deviceInfos = CamList.Where(o => o.SerialNumber == DeviceConfig.CameraSNNum).ToList();
             if(deviceInfos.Count == 0) return  Blresult;
             IDeviceInfo deviceInfo = deviceInfos.First();
@@ -119,8 +122,7 @@ namespace CCDCount.DLL
                 IGigEDevice gigEDevice = device as IGigEDevice;
 
                 // 探测网络最佳包大小(只对GigE相机有效)
-                int optionPacketSize;
-                result = gigEDevice.GetOptimalPacketSize(out optionPacketSize);
+                result = gigEDevice.GetOptimalPacketSize(out int optionPacketSize);
                 if (result != MvError.MV_OK)
                 {
                     //Log("Warning: Get Packet Size failed!", result);
@@ -199,8 +201,7 @@ namespace CCDCount.DLL
                 IGigEDevice gigEDevice = device as IGigEDevice;
 
                 // 探测网络最佳包大小(只对GigE相机有效)
-                int optionPacketSize;
-                result = gigEDevice.GetOptimalPacketSize(out optionPacketSize);
+                result = gigEDevice.GetOptimalPacketSize(out int optionPacketSize);
                 if (result != MvError.MV_OK)
                 {
                     //Log("Warning: Get Packet Size failed!", result);
@@ -217,6 +218,34 @@ namespace CCDCount.DLL
             return Blresult;
         }
 
+        /// <summary>
+        /// 重新加载相机参数
+        /// </summary>
+        /// <param name="RecameraConfig"></param>
+        /// <returns></returns>
+        public bool ReLoadCameraConfig(CameraConfig RecameraConfig)
+        {
+            bool Blresult = false;
+            if (device != null && device.IsConnected)
+            {
+                //设置从配置文件读取的参数
+                device.Parameters.GetStringValue("DeviceModelName", out IStringValue deviceModelName);
+                _cameraNo = RecameraConfig.CamerNo;
+                if (RecameraConfig.CameraName != deviceModelName.CurValue)
+                    device.Parameters.SetStringValue("DeviceUserID", RecameraConfig.CameraName);
+                device.Parameters.SetFloatValue("ExposureTime", RecameraConfig.ExposureTimeValue);
+                device.Parameters.SetIntValue("AcquisitionLineRate", RecameraConfig.AcquistionLineRateValue);
+                device.Parameters.SetIntValue("Height", RecameraConfig.Height);
+                device.Parameters.SetIntValue("Width", RecameraConfig.Width);
+                device.Parameters.SetIntValue("OffsetX", RecameraConfig.OffsetX);
+                // 设置采集连续模式
+                device.Parameters.SetEnumValueByString("AcquisitionMode", "Continuous");
+                device.Parameters.SetEnumValueByString("TriggerMode", "Off");
+                Blresult = true;
+            }
+            return Blresult;
+        }
+
         /// <summary>
         /// 开启相机采集
         /// </summary>
@@ -234,6 +263,9 @@ namespace CCDCount.DLL
             //StopEventGetImage();
         }
 
+        /// <summary>
+        /// 释放相机资源
+        /// </summary>
         public void DisPoseCamera()
         {
             if (device != null)
@@ -247,6 +279,12 @@ namespace CCDCount.DLL
                 }
             }
         }
+
+        /// <summary>
+        /// 获取一次图片
+        /// </summary>
+        /// <param name="IFrameData"></param>
+        /// <returns></returns>
         public bool GetOnceImage(out IFrameOut IFrameData)
         {
             bool result = false;
@@ -280,22 +318,20 @@ namespace CCDCount.DLL
         public CameraImageSizeClass GetCamereImageSize()
         { 
             CameraImageSizeClass cameraImageSize =new CameraImageSizeClass();
-            IIntValue PixWidth;
-            IIntValue PixHeight;
-            device.Parameters.GetIntValue("Width", out PixWidth);
-            device.Parameters.GetIntValue("Height", out PixHeight);
+            device.Parameters.GetIntValue("Width", out IIntValue PixWidth);
+            device.Parameters.GetIntValue("Height", out IIntValue PixHeight);
             cameraImageSize.Height = (int)PixHeight.CurValue;
             cameraImageSize.Width = (int)PixWidth.CurValue;
             return cameraImageSize;
         }
 
         /// <summary>
-        /// 获取Config信息
+        /// 获取当前相机的参数生成Config信息
         /// </summary>
         /// <returns></returns>
         public CameraConfig GetConfigValue()
         { 
-            CameraConfig result = null;
+            CameraConfig result;
             device.Parameters.GetFloatValue("ExposureTime", out IFloatValue exposureTime);
             device.Parameters.GetIntValue("AcquisitionLineRate", out IIntValue acquisitionLineRate);
             device.Parameters.GetIntValue("OffsetX", out IIntValue offsetX);
@@ -331,7 +367,7 @@ namespace CCDCount.DLL
 
         public bool IsLoadCamera()
         {
-            return device ==  null ? false : true;
+            return device != null;
         }
 
         public bool IsConnectCamera()
@@ -353,7 +389,8 @@ namespace CCDCount.DLL
         {
             try
             {
-                device.StreamGrabber.SetImageNodeNum(100);
+                if(device == null) return;
+                device.StreamGrabber.SetImageNodeNum(10);
                 device.StreamGrabber.StartGrabbing();
             }
             catch (Exception ex)

+ 95 - 0
TestWork.DLL/FaultLogClass.cs

@@ -0,0 +1,95 @@
+using CCDCount.DLL.SqlDataClass;
+using CCDCount.MODEL.ShuLiClass;
+using CCDCount.MODEL.SqlDataModel;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CCDCount.DLL
+{
+    public class FaultLogClass
+    {
+        public event EventHandler<EventArgs> ErroroCcurred;
+        ErrorMesSqliteDataClass errorMesSqliteDataClass = null;
+
+        public FaultLogClass(string dbPath)
+        {
+            errorMesSqliteDataClass = new ErrorMesSqliteDataClass(dbPath);
+        }
+
+        /// <summary>
+        /// 记录错误信息
+        /// </summary>
+        /// <param name="Message"></param>
+        /// <param name="userid"></param>
+        public void RecordErrorMessage(string Message,int userid)
+        {
+            ErroeMesDataModelClass errorMessage = new ErroeMesDataModelClass
+            {
+                Message = Message,
+                DateTime = DateTime.Now,
+                Category = "系统",
+                MessageType = "异常",
+                UserID = userid
+            };
+            errorMesSqliteDataClass.InsertErrMessage(errorMessage);
+            OnErroroCcurred();
+        }
+
+        /// <summary>
+        /// 记录更改信息
+        /// </summary>
+        /// <param name="Message"></param>
+        /// <param name="userid"></param>
+        public void RecordValueChangeMessage(string Message, int userid)
+        {
+            ErroeMesDataModelClass errorMessage = new ErroeMesDataModelClass
+            {
+                Message = Message,
+                DateTime = DateTime.Now,
+                Category = "系统",
+                MessageType = "值变更",
+                UserID = userid
+            };
+            errorMesSqliteDataClass.InsertErrMessage(errorMessage);
+        }
+
+        /// <summary>
+        /// 记录值保存信息
+        /// </summary>
+        /// <param name="Message"></param>
+        /// <param name="userid"></param>
+        public void RecordValueSaveMessage(string Message, int userid)
+        {
+            ErroeMesDataModelClass errorMessage = new ErroeMesDataModelClass
+            {
+                Message = Message,
+                DateTime = DateTime.Now,
+                Category = "系统",
+                MessageType = "值保存",
+                UserID = userid
+            };
+            errorMesSqliteDataClass.InsertErrMessage(errorMessage);
+        }
+
+        /// <summary>
+        /// 读取全部信息
+        /// </summary>
+        /// <returns></returns>
+        public List<ErroeMesDataModelClass> GetAllErrMessage()
+        {
+            return errorMesSqliteDataClass.GetAllErrMessage();
+        }
+
+        /// <summary>
+        /// 对外通知事件
+        /// </summary>
+        private void OnErroroCcurred()
+        {
+            // 触发事件
+            ErroroCcurred?.Invoke(this, null);
+        }
+    }
+}

+ 24 - 6
TestWork.DLL/MainThreadClass.cs

@@ -13,6 +13,7 @@ using System.IO;
 using System.Linq;
 using System.Runtime.InteropServices;
 using System.Runtime.Remoting.Messaging;
+using System.Text;
 using System.Threading;
 
 namespace CCDCount.DLL
@@ -26,6 +27,7 @@ namespace CCDCount.DLL
         CameraClass cameraClass = new CameraClass();
         public ShuLiConfigClass shuLiConfig = null;
         public CameraConfig cameraConfig = null;
+        public bool CameraConfigIsChange = false;
         public int ThisCamerNo = -1;
 
         public bool CameraStatic { get { return _CameraStatic; } }
@@ -108,15 +110,14 @@ namespace CCDCount.DLL
             ThisCamerNo = cameraConfig.CamerNo;
         }
 
-        public bool loadCamera()
+        public bool LoadCamera()
         {
             bool result = false;
             // 相机列表
-            List<CameraInfoClass> list = new List<CameraInfoClass>();
             try
             {
                 // 获取相机列表
-                cameraClass.GetCameraList(out list);
+                cameraClass.GetCameraList(out List<CameraInfoClass> list);
                 if (list.Count == 0)
                 {
                     LOG.error(string.Format("{0}:没有相机", "MainThreadClass-StartMianThread"));
@@ -130,14 +131,31 @@ namespace CCDCount.DLL
                     LOG.error(string.Format("{0}:相机加载失败", "MainThreadClass-StartMianThread"));
                     return result;
                 }
+                CameraConfigIsChange = false;
             }
-            catch(Exception e)
+            catch
             {
 
             }
             return result;
         }
 
+        public void ReLoadCameraConfig()
+        {
+            if(CameraConfigIsChange)
+            {
+                CameraConfig  OldcameraConfig = cameraClass.GetConfigValue();
+                if(OldcameraConfig.CameraSNNum != cameraConfig.CameraSNNum)
+                {
+                    cameraClass.LoadCamereDevice(cameraConfig);
+                }
+                else
+                {
+                    cameraClass.ReLoadCameraConfig(cameraConfig);
+                }
+            }
+        }
+
         /// <summary>
         /// 开始主线程
         /// </summary>
@@ -157,7 +175,7 @@ namespace CCDCount.DLL
                 shuLiClass.StartIdentifyFuntion(cameraClass.GetCamereImageSize().Width);
                 result = true;
             }
-            catch(Exception e)
+            catch
             {
 
             }
@@ -182,7 +200,7 @@ namespace CCDCount.DLL
                 StopSendBottLogicMessageThread();
                 result = true;
             }
-            catch (Exception ex)
+            catch
             {
             }
             return result;

+ 104 - 0
TestWork.DLL/SqlDataClass/ErrorMesSqliteDataClass.cs

@@ -0,0 +1,104 @@
+using CCDCount.MODEL.SqlDataModel;
+using System;
+using System.Collections.Generic;
+using System.Data.SQLite;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CCDCount.DLL.SqlDataClass
+{
+    public class ErrorMesSqliteDataClass
+    {
+        private readonly string _dbPath;
+
+        public ErrorMesSqliteDataClass(string dbPath)
+        {
+            _dbPath = dbPath;
+
+            // 1. 获取文件夹路径
+            string directoryPath = Path.GetDirectoryName(dbPath);
+
+            // 2. 检查文件夹是否存在
+            if (!Directory.Exists(directoryPath))
+            {
+                // 创建文件夹
+                Directory.CreateDirectory(directoryPath);
+            }
+            InitializeDatabase();
+        }
+
+        // 初始化数据库和表
+        private void InitializeDatabase()
+        {
+            if (!File.Exists(_dbPath))
+            {
+                SQLiteConnection.CreateFile(_dbPath);
+            }
+
+            using (var conn = new SQLiteConnection($"Data Source={_dbPath};Version=3;"))
+            {
+                conn.Open();
+                string createTableSql = @"
+                    CREATE TABLE IF NOT EXISTS ErrMessage (
+                        Id INTEGER PRIMARY KEY AUTOINCREMENT,
+                        Number INTEGER NOT NULL,
+                        Category TEXT NOT NULL,
+                        MessageType TEXT NOT NULL,
+                        Message TEXT NOT NULL,
+                        DateTime TEXT NOT NULL,
+                        UserID INTEGER NOT NULL
+                )";
+                new SQLiteCommand(createTableSql, conn).ExecuteNonQuery();
+            }
+        }
+
+        // 插入数据
+        public void InsertErrMessage(ErroeMesDataModelClass Message)
+        {
+            using (var conn = new SQLiteConnection($"Data Source={_dbPath};Version=3;"))
+            {
+                conn.Open();
+                string sql = "INSERT INTO ErrMessage (Number, Category, MessageType,Message,DateTime,UserID) VALUES (@Number, @Category, @MessageType,@Message, @DateTime, @UserID)";
+                var cmd = new SQLiteCommand(sql, conn);
+                cmd.Parameters.AddWithValue("@Number", Message.Number);
+                cmd.Parameters.AddWithValue("@Category", Message.Category);
+                cmd.Parameters.AddWithValue("@MessageType", Message.MessageType);
+                cmd.Parameters.AddWithValue("@Message", Message.Message);
+                cmd.Parameters.AddWithValue("@DateTime", Message.DateTime.ToString("yyyy-MM-dd HH:mm:ss.fff")); // 格式化为字符串
+                cmd.Parameters.AddWithValue("@UserID", Message.UserID);
+                cmd.ExecuteNonQuery();
+            }
+        }
+
+        // 查询所有数据
+        public List<ErroeMesDataModelClass> GetAllErrMessage()
+        {
+            var persons = new List<ErroeMesDataModelClass>();
+            using (var conn = new SQLiteConnection($"Data Source={_dbPath};Version=3;"))
+            {
+                conn.Open();
+                string sql = "SELECT * FROM ErrMessage";
+                var cmd = new SQLiteCommand(sql, conn);
+                using (SQLiteDataReader reader = cmd.ExecuteReader())
+                {
+                    while (reader.Read())
+                    {
+                        persons.Add(new ErroeMesDataModelClass
+                        {
+                            Number = Convert.ToInt32(reader["Number"]),
+                            Category = reader["Category"].ToString(),
+                            MessageType = reader["MessageType"].ToString(),
+                            Message = reader["Message"].ToString(),
+                            UserID = Convert.ToInt32(reader["UserID"]),
+                            // 解析时间字符串
+                            DateTime = DateTime.Parse(reader["DateTime"].ToString())
+                        });
+                    }
+                }
+            }
+            return persons;
+        }
+    }
+}

+ 268 - 0
TestWork.DLL/SqlDataClass/UserMessSqliteDataClass.cs

@@ -0,0 +1,268 @@
+using CCDCount.MODEL.SqlDataModel;
+using System;
+using System.Collections.Generic;
+using System.Data.SQLite;
+using System.IO;
+using System.Linq;
+using System.Security.Cryptography;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CCDCount.DLL.SqlDataClass
+{
+    public class UserMessSqliteDataClass
+    {
+        private readonly string _dbPath;
+
+        //构建方法,根绝地址初始化数据库
+        public UserMessSqliteDataClass(string dbPath)
+        {
+            _dbPath = dbPath;
+
+            // 1. 获取文件夹路径
+            string directoryPath = Path.GetDirectoryName(dbPath);
+
+            // 2. 检查文件夹是否存在
+            if (!Directory.Exists(directoryPath))
+            {
+                // 创建文件夹
+                Directory.CreateDirectory(directoryPath);
+            }
+            InitializeDatabase();
+        }
+
+        // 初始化数据库和表
+        private void InitializeDatabase()
+        {
+            if (!File.Exists(_dbPath))
+            {
+                SQLiteConnection.CreateFile(_dbPath);
+            }
+
+            using (var conn = new SQLiteConnection($"Data Source={_dbPath};Version=3;"))
+            {
+                conn.Open();
+                string createTableSql = @"
+                    CREATE TABLE IF NOT EXISTS UserMessage (
+                        Id INTEGER PRIMARY KEY AUTOINCREMENT,
+                        UserName TEXT NOT NULL,
+                        PassWord TEXT NOT NULL,
+                        UserMes TEXT NOT NULL,
+                        DateTime TEXT NOT NULL,
+                        IsDelete INTEGER CHECK (IsDelete IN (0, 1)),
+                        IsAdmin INTEGER CHECK (IsAdmin IN (0, 1))
+                )";
+                new SQLiteCommand(createTableSql, conn).ExecuteNonQuery();
+            }
+        }
+
+        // 插入数据
+        public int InsertUserMessage(UserMesDataModelClass Message)
+        {
+            int result = -1;
+            if(GetUserMessageForName(Message.UserName).Count>0)
+            {
+                result = 2;
+                return result;
+            }
+            using (var conn = new SQLiteConnection($"Data Source={_dbPath};Version=3;"))
+            {
+                conn.Open();
+                string sql = "INSERT INTO UserMessage (UserName, PassWord,UserMes,IsDelete,IsAdmin,DateTime) VALUES (@UserName, @PassWord,@UserMes,@IsDelete,@IsAdmin,@DateTime)";
+                var cmd = new SQLiteCommand(sql, conn);
+                cmd.Parameters.AddWithValue("@UserName", Message.UserName);
+                cmd.Parameters.AddWithValue("@PassWord", HashPassword(Message.PassWord));
+                cmd.Parameters.AddWithValue("@UserMes", Message.UserMes);
+                cmd.Parameters.AddWithValue("@IsDelete", Message.IsDelete == true ? 1 : 0);
+                cmd.Parameters.AddWithValue("@IsAdmin", Message.IsAdmin == true ? 1 : 0);
+                cmd.Parameters.AddWithValue("@DateTime", Message.DateTime.ToString("yyyy-MM-dd HH:mm:ss.fff")); // 格式化为字符串
+                cmd.ExecuteNonQuery();
+                result = 0;
+            }
+            return result;
+        }
+
+        // 查询所有数据
+        public List<UserMesDataModelClass> GetAllUserMessage()
+        {
+            var persons = new List<UserMesDataModelClass>();
+            using (var conn = new SQLiteConnection($"Data Source={_dbPath};Version=3;"))
+            {
+                conn.Open();
+                string sql = "SELECT * FROM UserMessage WHERE IsDelete=0";
+                var cmd = new SQLiteCommand(sql, conn);
+                using (SQLiteDataReader reader = cmd.ExecuteReader())
+                {
+                    while (reader.Read())
+                    {
+                        persons.Add(new UserMesDataModelClass
+                        {
+                            Id = Convert.ToInt32(reader["Id"]),
+                            UserName = reader["UserName"].ToString(),
+                            PassWord = reader["PassWord"].ToString(),
+                            UserMes = reader["UserMes"].ToString(),
+                            // 解析时间字符串
+                            DateTime = DateTime.Parse(reader["DateTime"].ToString()),
+                            IsAdmin = Convert.ToInt32(reader["IsAdmin"]) == 1 ? true : false,
+                            IsDelete = Convert.ToInt32(reader["IsDelete"]) == 1 ? true : false
+                        });
+                    }
+                }
+            }
+            return persons;
+        }
+
+        // 查询对应用户名的所有信息
+        public List<UserMesDataModelClass> GetUserMessageForName(string UserName)
+        {
+            var persons = new List<UserMesDataModelClass>();
+            using (var conn = new SQLiteConnection($"Data Source={_dbPath};Version=3;"))
+            {
+                conn.Open();
+                string sql = "SELECT * FROM UserMessage WHERE UserName = @UserName AND IsDelete = 0";
+                var cmd = new SQLiteCommand(sql, conn);
+                cmd.Parameters.AddWithValue("@UserName", UserName);
+                using (SQLiteDataReader reader = cmd.ExecuteReader())
+                {
+                    while (reader.Read())
+                    {
+                        persons.Add(new UserMesDataModelClass
+                        {
+                            Id = Convert.ToInt32(reader["Id"]),
+                            UserName = reader["UserName"].ToString(),
+                            PassWord = reader["PassWord"].ToString(),
+                            UserMes = reader["UserMes"].ToString(),
+                            // 解析时间字符串
+                            DateTime = DateTime.Parse(reader["DateTime"].ToString()),
+                            IsAdmin = Convert.ToInt32(reader["IsAdmin"]) == 1 ? true : false,
+                            IsDelete = Convert.ToInt32(reader["IsDelete"]) == 1 ? true : false
+                        });
+                    }
+                }
+            }
+            return persons;
+        }
+
+        // 查询对应用户ID的所有信息
+        public List<UserMesDataModelClass> GetUserMessageForId(int Id)
+        {
+            var persons = new List<UserMesDataModelClass>();
+            using (var conn = new SQLiteConnection($"Data Source={_dbPath};Version=3;"))
+            {
+                conn.Open();
+                string sql = "SELECT * FROM UserMessage WHERE Id = @Id AND IsDelete = 0";
+                var cmd = new SQLiteCommand(sql, conn);
+                cmd.Parameters.AddWithValue("@Id", Id);
+                using (SQLiteDataReader reader = cmd.ExecuteReader())
+                {
+                    while (reader.Read())
+                    {
+                        persons.Add(new UserMesDataModelClass
+                        {
+                            Id = Convert.ToInt32(reader["Id"]),
+                            UserName = reader["UserName"].ToString(),
+                            PassWord = reader["PassWord"].ToString(),
+                            UserMes = reader["UserMes"].ToString(),
+                            // 解析时间字符串
+                            DateTime = DateTime.Parse(reader["DateTime"].ToString()),
+                            IsAdmin = Convert.ToInt32(reader["IsAdmin"]) == 1 ? true : false,
+                            IsDelete = Convert.ToInt32(reader["IsDelete"]) == 1 ? true : false
+                        });
+                    }
+                }
+            }
+            return persons;
+        }
+
+        //查询用户名的登录信息是否正确
+        public bool CheckUserLogin(string UserName, string PassWord)
+        {
+            return GetAllUserMessage().Any(x => x.UserName == UserName && x.PassWord == HashPassword(PassWord));
+        }
+
+        //修改密码(使用ID)
+        public bool ChangePassWord(int Id, string OldPassWord, string NewPassWord)
+        {
+            bool result = false;
+            using (var conn = new SQLiteConnection($"Data Source={_dbPath};Version=3;"))
+            {
+                conn.Open();
+                string sql = "UPDATE UserMessage SET PassWord = @PassWord WHERE Id = @Id AND IsDelete = 0";
+                var cmd = new SQLiteCommand(sql, conn);
+                cmd.Parameters.AddWithValue("@PassWord", HashPassword(NewPassWord));
+                cmd.Parameters.AddWithValue("@Id", Id);
+                cmd.ExecuteNonQuery();
+                result = true;
+            }
+            return result;
+        }
+
+        public bool ChangeUserMessage(int Id,UserMesDataModelClass Message)
+        {
+            bool result = false;
+            using (var conn = new SQLiteConnection($"Data Source={_dbPath};Version=3;"))
+            {
+                conn.Open();
+                string sql = "UPDATE UserMessage SET UserName = @UserName,PassWord = @PassWord,UserMes = @UserMes,IsAdmin = @IsAdmin WHERE Id = @Id AND IsDelete = 0";
+                var cmd = new SQLiteCommand(sql, conn);
+                cmd.Parameters.AddWithValue("@UserName", Message.UserName);
+                cmd.Parameters.AddWithValue("@PassWord", HashPassword(Message.PassWord));
+                cmd.Parameters.AddWithValue("@UserMes", Message.UserMes);
+                cmd.Parameters.AddWithValue("@Id", Id);
+                cmd.Parameters.AddWithValue("@IsAdmin", Message.IsAdmin);
+                cmd.ExecuteNonQuery();
+                result = true;
+            }
+            return result;
+        }
+        
+        // 重置密码
+        public bool ResetPassWord(int Id)
+        {
+            bool result = false;
+            using (var conn = new SQLiteConnection($"Data Source={_dbPath};Version=3;"))
+            {
+                conn.Open();
+                string sql = "UPDATE UserMessage SET PassWord = @PassWord WHERE UserName = @UserName AND IsDelete = 0";
+                var cmd = new SQLiteCommand(sql, conn);
+                cmd.Parameters.AddWithValue("@PassWord", HashPassword("123456"));
+                cmd.Parameters.AddWithValue("@Id", Id);
+                cmd.ExecuteNonQuery();
+                result = true;
+            }
+            return result;
+        }
+
+        // 删除用户信息
+        public bool DeleteUserMessage(int Id)
+        {
+            bool result = false;
+            using (var conn = new SQLiteConnection($"Data Source={_dbPath};Version=3;"))
+            {
+                conn.Open();
+                string sql = "UPDATE UserMessage SET IsDelete = 1 WHERE Id = @Id";
+                var cmd = new SQLiteCommand(sql, conn);
+                cmd.Parameters.AddWithValue("@Id", Id);
+                cmd.ExecuteNonQuery();
+                result = true;
+            }
+            return result;
+        }
+
+
+        // Hash密码加密
+        public string HashPassword(string password)
+        {
+            using (SHA256 sha256 = SHA256.Create())
+            {
+                byte[] bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(password));
+                StringBuilder builder = new StringBuilder();
+                for (int i = 0; i < bytes.Length; i++)
+                {
+                    builder.Append(bytes[i].ToString("x2"));
+                }
+                return builder.ToString();
+            }
+        }
+    }
+}

+ 0 - 12
TestWork.DLL/Tools/SqliteDataClass.cs

@@ -1,12 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace CCDCount.DLL.Tools
-{
-    internal class SqliteDataClass
-    {
-    }
-}

+ 16 - 0
TestWork.DLL/app.config

@@ -1,5 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <configuration>
+  <configSections>
+    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
+    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
+  </configSections>
   <runtime>
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <dependentAssembly>
@@ -8,4 +12,16 @@
       </dependentAssembly>
     </assemblyBinding>
   </runtime>
+  <entityFramework>
+    <providers>
+      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
+      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
+    </providers>
+  </entityFramework>
+  <system.data>
+    <DbProviderFactories>
+      <remove invariant="System.Data.SQLite.EF6" />
+      <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
+    <remove invariant="System.Data.SQLite" /><add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" /></DbProviderFactories>
+  </system.data>
 </configuration>

+ 6 - 0
TestWork.DLL/packages.config

@@ -1,11 +1,17 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
   <package id="CsvHelper" version="33.0.1" targetFramework="net48" />
+  <package id="EntityFramework" version="6.4.4" targetFramework="net48" />
   <package id="Microsoft.Bcl.AsyncInterfaces" version="8.0.0" targetFramework="net48" />
   <package id="Microsoft.Bcl.HashCode" version="1.1.1" targetFramework="net48" />
   <package id="Microsoft.CSharp" version="4.7.0" targetFramework="net48" />
   <package id="NModbus" version="3.0.81" targetFramework="net48" />
+  <package id="Stub.System.Data.SQLite.Core.NetFramework" version="1.0.119.0" targetFramework="net48" />
   <package id="System.Buffers" version="4.4.0" targetFramework="net48" />
+  <package id="System.Data.SQLite" version="1.0.119.0" targetFramework="net48" />
+  <package id="System.Data.SQLite.Core" version="1.0.119.0" targetFramework="net48" />
+  <package id="System.Data.SQLite.EF6" version="1.0.119.0" targetFramework="net48" />
+  <package id="System.Data.SQLite.Linq" version="1.0.119.0" targetFramework="net48" />
   <package id="System.Memory" version="4.5.0" targetFramework="net48" />
   <package id="System.Numerics.Vectors" version="4.4.0" targetFramework="net48" />
   <package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net48" />

+ 2 - 1
TestWork.MODEL/CCDCount.MODEL.csproj

@@ -50,10 +50,11 @@
     <Compile Include="ShuLiClass\ActiveObjectClass.cs" />
     <Compile Include="ShuLiClass\ActiveObjectEventArgsClass.cs" />
     <Compile Include="ConfigModel\ShuLiConfigClass.cs" />
+    <Compile Include="SqlDataModel\ErroeMesDataModelClass.cs" />
+    <Compile Include="SqlDataModel\UserMesDataModelClass.cs" />
   </ItemGroup>
   <ItemGroup>
     <Folder Include="BottingClass\" />
-    <Folder Include="SqlDataModel\" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 </Project>

+ 40 - 0
TestWork.MODEL/SqlDataModel/ErroeMesDataModelClass.cs

@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CCDCount.MODEL.SqlDataModel
+{
+    public class ErroeMesDataModelClass
+    {
+        /// <summary>
+        /// 主键
+        /// </summary>
+        public int ID { get; set; }
+        /// <summary>
+        /// 错误编号
+        /// </summary>
+        public int Number { get; set; }
+        /// <summary>
+        /// 信息类别
+        /// </summary>
+        public string Category { get; set; }
+        /// <summary>
+        /// 信息类型
+        /// </summary>
+        public string MessageType { get; set; }
+        /// <summary>
+        /// 错误信息
+        /// </summary>
+        public string Message { get; set; }
+        /// <summary>
+        /// 记录时间
+        /// </summary>
+        public DateTime DateTime { get; set; }
+        /// <summary>
+        /// 用户ID
+        /// </summary>
+        public int UserID { get; set; }
+    }
+}

+ 19 - 0
TestWork.MODEL/SqlDataModel/UserMesDataModelClass.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace CCDCount.MODEL.SqlDataModel
+{
+    public class UserMesDataModelClass
+    {
+        public int Id { get; set;}
+        public string UserName {  get; set;}
+        public string PassWord {  get; set;}
+        public string UserMes {  get; set;}
+        public DateTime DateTime {  get; set;}
+        public bool IsDelete { get; set;}
+        public bool IsAdmin { get; set;}
+    }
+}