41 Commits

Author SHA1 Message Date
d0a928eb40 提交 2025-04-08 16:21:15 +08:00
3401a3b254 rbac修改与删除之前的简单rbac 2025-04-08 16:17:34 +08:00
9f7c6206ca 提交rbac
提交设置右键错位的bug
2025-04-08 15:15:02 +08:00
TD
ab38ee029a 同上 2025-04-02 20:14:41 +08:00
TD
dbf412713b 修改所有的保存图片 2025-04-02 20:14:06 +08:00
TD
67ba78f268 村结果图有问题 2025-04-02 19:13:18 +08:00
TD
d63a6c42b3 保存图片有问题 2025-04-02 18:26:34 +08:00
babc40d36a 保存图片更新试试 2025-04-02 14:41:26 +08:00
409089e2ca 增加日志 2025-04-01 18:15:30 +08:00
e08386333a 1 2025-03-31 08:56:01 +08:00
b19feb5a44 释放模型 2025-03-27 18:03:07 +08:00
TD
0865af247a 111 2025-03-27 17:51:07 +08:00
TD
8d32269ee0 Merge branch 'dev_lilili' of https://gitea.star-rising.cn/xiaohuimin/DHDHSoftware into dev_lilili 2025-03-27 15:31:37 +08:00
TD
b4569f8ccc 清理 2025-03-27 15:31:36 +08:00
9e38ea85c8 修改UPH 2025-03-27 15:30:52 +08:00
TD
3be4b185d6 提交UPH 准备修改 2025-03-27 15:11:48 +08:00
5d77eebc67 提交 2025-03-27 12:07:23 +08:00
8868915944 提交 2025-03-27 11:41:44 +08:00
2d98b2d8b8 提交整体修改 2025-03-27 11:37:48 +08:00
bee7dc6f03 上传UPH 2025-03-26 11:37:23 +08:00
1046978877 Merge branch 'dev_xiao' into dev_lilili 2025-03-25 19:05:06 +08:00
bc981fc7a9 首次提交lilili 2025-03-25 18:55:59 +08:00
TD
09c2eb37fe 修改界面 2025-03-25 15:33:35 +08:00
TD
2a6019bfbd 初步界面测试 2025-03-25 13:56:48 +08:00
fabc7606e7 代码清理 2025-03-24 19:24:16 +08:00
fb1ae0bb08 修改标签 2025-03-24 19:20:16 +08:00
8619d8ba2e yb 2025-03-24 19:04:03 +08:00
b60d2759b1 修改标签路径 2025-03-24 19:03:30 +08:00
959a2bf642 只有在没数据库的情况下才初始化种子 2025-03-24 18:41:23 +08:00
cb7e216b3a 提交单例模式释放错误 2025-03-24 18:26:01 +08:00
33c2994455 提交 2025-03-24 18:22:03 +08:00
2b32e1a649 加载界面、程序关闭界面、单例模式 2025-03-24 18:21:21 +08:00
TD
d881dc6ec0 1 2025-03-24 17:24:14 +08:00
126db6bf91 Merge branch 'dev_xiao' of https://gitea.star-rising.cn/xiaohuimin/DHDHSoftware into dev_xiao 2025-03-24 15:21:21 +08:00
447cf4326b 提交 2025-03-24 15:21:16 +08:00
9973470e55 Merge branch 'dev_xiao' of https://gitea.star-rising.cn/xiaohuimin/DHDHSoftware into dev_xiao 2025-03-24 15:20:45 +08:00
b8d7371a56 推送 2025-03-24 15:20:33 +08:00
8aec9ba7fa 修改一点界面 2025-03-22 16:16:34 +08:00
f0f88624ae 修改一些变量和界面 2025-03-21 16:29:08 +08:00
9a5d3be528 提交 2025-03-21 08:51:20 +08:00
0dedff36fd 提交 2025-03-18 14:19:33 +08:00
294 changed files with 50120 additions and 4520 deletions

View File

@ -110,7 +110,7 @@ namespace CanFly.Canvas.Shape
/// <summary> /// <summary>
/// 是否填充多边形 使用select_fill_color 或 fill_color 填充 /// 是否填充多边形使用select_fill_color 或 fill_color 填充
/// </summary> /// </summary>
public bool fill = false; public bool fill = false;

View File

@ -3,14 +3,14 @@
partial class FlyCanvas partial class FlyCanvas
{ {
/// <summary> /// <summary>
/// 必需的设计器变量 /// 必需的设计器变量
/// </summary> /// </summary>
private System.ComponentModel.IContainer components = null; private System.ComponentModel.IContainer components = null;
///// <summary> ///// <summary>
///// 清理所有正在使用的资源 ///// 清理所有正在使用的资源
///// </summary> ///// </summary>
///// <param name="disposing">如果应释放托管资源,为 true否则为 false </param> ///// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
//protected override void Dispose(bool disposing) //protected override void Dispose(bool disposing)
//{ //{
// if (disposing && (components != null)) // if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary> /// <summary>
/// 设计器支持所需的方法 - 不要修改 /// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容 /// 使用代码编辑器修改此方法的内容
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {

View File

@ -1704,9 +1704,9 @@ namespace CanFly.Canvas.UI
/// <summary> /// <summary>
/// 清理所有正在使用的资源 /// 清理所有正在使用的资源
/// </summary> /// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param> /// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)
{ {
if (disposing && (components != null)) if (disposing && (components != null))

View File

@ -1,10 +1,10 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// 此代码由工具生成 // 此代码由工具生成
// 运行时版本:4.0.30319.42000 // 运行时版本:4.0.30319.42000
// //
// 对此文件的更改可能会导致不正确的行为,并且如果 // 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失 // 重新生成代码,这些更改将会丢失
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@ -13,12 +13,12 @@ namespace XKRS.CanFly.Properties {
/// <summary> /// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等 /// 一个强类型的资源类,用于查找本地化的字符串等
/// </summary> /// </summary>
// 此类是由 StronglyTypedResourceBuilder // 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的 // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目 // (以 /str 作为命令选项),或重新生成 VS 项目
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
@ -33,7 +33,7 @@ namespace XKRS.CanFly.Properties {
} }
/// <summary> /// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例 /// 返回此类使用的缓存的 ResourceManager 实例
/// </summary> /// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager { internal static global::System.Resources.ResourceManager ResourceManager {
@ -48,7 +48,7 @@ namespace XKRS.CanFly.Properties {
/// <summary> /// <summary>
/// 重写当前线程的 CurrentUICulture 属性,对 /// 重写当前线程的 CurrentUICulture 属性,对
/// 使用此强类型资源类的所有资源查找执行重写 /// 使用此强类型资源类的所有资源查找执行重写
/// </summary> /// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture { internal static global::System.Globalization.CultureInfo Culture {
@ -61,7 +61,7 @@ namespace XKRS.CanFly.Properties {
} }
/// <summary> /// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源 /// 查找 System.Drawing.Bitmap 类型的本地化资源
/// </summary> /// </summary>
internal static System.Drawing.Bitmap Close { internal static System.Drawing.Bitmap Close {
get { get {

View File

@ -3,14 +3,14 @@
partial class CtrlTitleBar partial class CtrlTitleBar
{ {
/// <summary> /// <summary>
/// 必需的设计器变量 /// 必需的设计器变量
/// </summary> /// </summary>
private System.ComponentModel.IContainer components = null; private System.ComponentModel.IContainer components = null;
/// <summary> /// <summary>
/// 清理所有正在使用的资源 /// 清理所有正在使用的资源
/// </summary> /// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param> /// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)
{ {
if (disposing && (components != null)) if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary> /// <summary>
/// 设计器支持所需的方法 - 不要修改 /// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容 /// 使用代码编辑器修改此方法的内容
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {

View File

@ -3,14 +3,14 @@
partial class GuideCircleCtrl partial class GuideCircleCtrl
{ {
/// <summary> /// <summary>
/// 必需的设计器变量 /// 必需的设计器变量
/// </summary> /// </summary>
private System.ComponentModel.IContainer components = null; private System.ComponentModel.IContainer components = null;
/// <summary> /// <summary>
/// 清理所有正在使用的资源 /// 清理所有正在使用的资源
/// </summary> /// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param> /// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)
{ {
if (disposing && (components != null)) if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary> /// <summary>
/// 设计器支持所需的方法 - 不要修改 /// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容 /// 使用代码编辑器修改此方法的内容
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {

View File

@ -3,14 +3,14 @@
partial class GuideHeightCtrl partial class GuideHeightCtrl
{ {
/// <summary> /// <summary>
/// 必需的设计器变量 /// 必需的设计器变量
/// </summary> /// </summary>
private System.ComponentModel.IContainer components = null; private System.ComponentModel.IContainer components = null;
/// <summary> /// <summary>
/// 清理所有正在使用的资源 /// 清理所有正在使用的资源
/// </summary> /// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param> /// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)
{ {
if (disposing && (components != null)) if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary> /// <summary>
/// 设计器支持所需的方法 - 不要修改 /// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容 /// 使用代码编辑器修改此方法的内容
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {

View File

@ -3,14 +3,14 @@
partial class GuideLineCircleCtrl partial class GuideLineCircleCtrl
{ {
/// <summary> /// <summary>
/// 必需的设计器变量 /// 必需的设计器变量
/// </summary> /// </summary>
private System.ComponentModel.IContainer components = null; private System.ComponentModel.IContainer components = null;
/// <summary> /// <summary>
/// 清理所有正在使用的资源 /// 清理所有正在使用的资源
/// </summary> /// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param> /// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)
{ {
if (disposing && (components != null)) if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary> /// <summary>
/// 设计器支持所需的方法 - 不要修改 /// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容 /// 使用代码编辑器修改此方法的内容
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {

View File

@ -3,14 +3,14 @@
partial class GuideLineCtrl partial class GuideLineCtrl
{ {
/// <summary> /// <summary>
/// 必需的设计器变量 /// 必需的设计器变量
/// </summary> /// </summary>
private System.ComponentModel.IContainer components = null; private System.ComponentModel.IContainer components = null;
/// <summary> /// <summary>
/// 清理所有正在使用的资源 /// 清理所有正在使用的资源
/// </summary> /// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false </param> /// <param name="disposing">如果应释放托管资源,为 true否则为 false</param>
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)
{ {
if (disposing && (components != null)) if (disposing && (components != null))
@ -24,7 +24,7 @@
/// <summary> /// <summary>
/// 设计器支持所需的方法 - 不要修改 /// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容 /// 使用代码编辑器修改此方法的内容
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {

View File

@ -11,12 +11,6 @@
<Platforms>AnyCPU;x64</Platforms> <Platforms>AnyCPU;x64</Platforms>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<Compile Remove="Halcon\**" />
<EmbeddedResource Remove="Halcon\**" />
<None Remove="Halcon\**" />
</ItemGroup>
@ -30,6 +24,10 @@
<ProjectReference Include="..\CanFly.Canvas\CanFly.Canvas.csproj" /> <ProjectReference Include="..\CanFly.Canvas\CanFly.Canvas.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Halcon\" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="OpenCvSharp4" Version="4.10.0.20241108" /> <PackageReference Include="OpenCvSharp4" Version="4.10.0.20241108" />
<PackageReference Include="OpenCvSharp4.Extensions" Version="4.10.0.20241108" /> <PackageReference Include="OpenCvSharp4.Extensions" Version="4.10.0.20241108" />

View File

@ -1,130 +0,0 @@
using System.ComponentModel;
using System.Drawing.Imaging;
using OpenCvSharp;
namespace DH.Devices.Devices
{
public class CameraBase
{
public volatile int SnapshotCount = 0;
public virtual bool isEnabled { get; set; } = false;
[Category("采图模式")]
[Description("是否连续模式 true连续模式采图false触发模式采图")]
[DisplayName("连续模式")]
public bool IsContinueMode { get; set; } = false;
public virtual bool isSavePicEnabled { get; set; } = false;
[Category("图片保存")]
[Description("图片保存文件夹")]
[DisplayName("图片保存文件夹")]
public virtual string ImageSaveDirectory { get; set; }
[Category("图片保存")]
[Description("图片保存格式")]
[DisplayName("图片保存格式")]
public ImageFormat ImageFormat { get; set; } = ImageFormat.Jpeg;
[Category("采图模式")]
[Description("是否硬触发模式 true硬触发false软触发")]
[DisplayName("硬触发")]
public bool IsHardwareTrigger { get; set; } = false;
public string SerialNumber { get; set; } = string.Empty;
public string CameraName { get; set; } = string.Empty;
public string CameraIP { get; set; } = string.Empty;
public string ComputerIP { get; set; } = string.Empty;
// public StreamFormat dvpStreamFormat = dvpStreamFormat.;
[Category("采图模式")]
[Description("是否传感器直接硬触发 true传感器硬触发不通过软件触发false通过软件触发IO 的硬触发模式")]
[DisplayName("是否传感器直接硬触发")]
public bool IsDirectHardwareTrigger { get; set; } = false;
/// <summary>
/// 增益
/// </summary>
[Category("相机设置")]
[DisplayName("增益")]
[Description("Gain增益,-1:不设置不同型号相机的增益请参考mvs")]
public float Gain { get; set; } = -1;
[Category("图像旋转")]
[Description("默认旋转,相机开启后默认不旋转")]
[DisplayName("默认旋转")]
public virtual float RotateImage { get; set; } = 0;
[Category("取像配置")]
[Description("曝光")]
[DisplayName("曝光")]
public virtual float Exposure { get; set; } = 200;
[Category("相机设置")]
[DisplayName("硬触发后的延迟")]
[Description("TriggerDelay:硬触发后的延迟,单位us 微秒")]
public float TriggerDelay { get; set; } = 0;
/// <summary>
/// 滤波时间
/// </summary>
[Category("相机设置")]
[DisplayName("滤波时间")]
[Description("LineDebouncerTimeI/O去抖时间 单位us")]
public int LineDebouncerTime { get; set; } = 0;
public Action<DateTime, CameraBase, Mat> OnHImageOutput { get; set; }
/// <summary>
/// 相机连接
/// </summary>
/// <returns>是否成功</returns>
public virtual bool CameraConnect() { return false; }
/// <summary>
/// 相机断开
/// </summary>
/// <returns>是否成功</returns>
public virtual bool CameraDisConnect() { return false; }
/// <summary>
/// 抓取一张图像
/// </summary>
/// <returns>图像</returns>
//internal virtual HObject GrabOneImage(string cameraName) { return null; }
/// <summary>
/// 设置曝光时间
/// </summary>
/// <param name="exposureTime">曝光时间</param>
public virtual void SetExposure(int exposureTime, string cameraName) { }
/// <summary>
/// 设置增益
/// </summary>
/// <param name="exposure">增益</param>
public virtual void SetGain(int gain, string cameraName) { }
/// <summary>
/// 设置采集模式
/// </summary>
/// <param name="mode">0=连续采集,即异步采集 1=单次采集,即同步采集</param>
internal virtual void SetAcquisitionMode(int mode) { }
/// <summary>
/// 设置采集图像的ROI
/// </summary>
internal virtual void SetAcqRegion(int offsetV, int offsetH, int imageH, int imageW, string cameraName) { }
}
}

View File

@ -1,186 +0,0 @@
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Imaging;
using DH.Commons.Enums;
using HalconDotNet;
using OpenCvSharp;
namespace DH.Devices.Devices
{
/// <summary>
/// 视觉处理引擎1.传统视觉 2.深度学习
/// CV深度学习 四大领域
/// Image Classification 图像分类:判别图中物体是什么,比如是猫还是狗;
/// Semantic Segmentation 语义分割:对图像进行像素级分类,预测每个像素属于的类别,不区分个体;
/// Object Detection 目标检测:寻找图像中的物体并进行定位;
/// Instance Segmentation 实例分割:定位图中每个物体,并进行像素级标注,区分不同个体;
/// </summary>
public abstract class VisionEngineBase
{
public List<DetectionConfig> DetectionConfigs = new List<DetectionConfig>();
#region event
public event Action<string, List<double>> OnCropParamsOutput;
public event Action<string, Bitmap, List<IShapeElement>> OnDetectionDone;
public event Action<string> OnDetectionWarningStop;//有无检测 需要报警停机
#endregion
//public VisionEngineInitialConfigBase IConfig
//{
// get => InitialConfig as VisionEngineInitialConfigBase;
//}
// public ImageSaveHelper ImageSaveHelper { get; set; } = new ImageSaveHelper();
public string BatchNO { get; set; }
public HTuple hv_ModelID;
public abstract DetectStationResult RunInference(Mat originImgSet, string detectionId = null);
//public abstract void SaveDetectResultAsync(DetectStationResult detectResult);
public virtual void DetectionDone(string detectionId, Bitmap image, List<IShapeElement> detectionResults)
{
OnDetectionDone?.Invoke(detectionId, image, detectionResults);
}
public virtual void DetectionWarningStop(string detectionDes)
{
OnDetectionWarningStop?.Invoke(detectionDes);
}
public virtual void SaveImageAsync(string fullname, Bitmap saveMap, ImageFormat imageFormat)
{
if (saveMap != null)
{
//ImageSaveSet imageSaveSet = new ImageSaveSet()
//{
// FullName = fullname,
// SaveImage = saveMap.CopyBitmap(),
// ImageFormat = imageFormat.DeepSerializeClone()
//};
//ImageSaveHelper.ImageSaveAsync(imageSaveSet);
}
}
}
public class CamModuleXY
{
[Category("图片行")]
[DisplayName("行")]
[Description("行")]
// [TypeConverter(typeof(DeviceIdSelectorConverter<CameraBase>))]
//[TypeConverter(typeof(CollectionCountConvert))]
public int PicRows { get; set; } = 1;
[Category("图片列")]
[DisplayName("列")]
[Description("列")]
// [TypeConverter(typeof(DeviceIdSelectorConverter<CameraBase>))]
//[TypeConverter(typeof(CollectionCountConvert))]
public int PicCols { get; set; } = 1;
public string GetDisplayText()
{
return "行:" + PicRows.ToString() + "列:" + PicCols.ToString();
}
}
//public class RelatedCamera
//{
// [Category("关联相机")]
// [DisplayName("关联相机")]
// [Description("关联相机描述")]
// //[TypeConverter(typeof(DeviceIdSelectorConverter<CameraBase>))]
// //[TypeConverter(typeof(CollectionCountConvert))]
// public string CameraSourceId { get; set; } = "";
// //public string GetDisplayText()
// //{
// // using (var scope = GlobalVar.Container.BeginLifetimeScope())
// // {
// // List<IDevice> deviceList = scope.Resolve<List<IDevice>>();
// // IDevice CameraDevice = deviceList.FirstOrDefault(dev => dev.Id.Equals(CameraSourceId));
// // if (CameraDevice != null && CameraDevice is CameraBase)
// // {
// // return CameraDevice.Name;
// // }
// // }
// // return CameraSourceId;
// //}
//}
public class VisionEngineInitialConfigBase //: InitialConfigBase
{
[Category("深度学习检测配置")]
[DisplayName("检测配置集合")]
[Description("检测配置集合")]
//[TypeConverter(typeof(CollectionCountConvert))]
//[Editor(typeof(ComplexCollectionEditor<DetectionConfig>), typeof(UITypeEditor))]
public List<DetectionConfig> DetectionConfigs { get; set; } = new List<DetectionConfig>();
[Category("深度学习检测配置")]
[DisplayName("标签分类")]
[Description("标签分类,A_NG,B_TBD...")]
// [TypeConverter(typeof(CollectionCountConvert))]
// [Editor(typeof(ComplexCollectionEditor<RecongnitionLabelCategory>), typeof(UITypeEditor))]
public List<RecongnitionLabelCategory> RecongnitionLabelCategoryList { get; set; } = new List<RecongnitionLabelCategory>();
[Category("深度学习检测配置")]
[DisplayName("检测标签定义集合")]
[Description("定义检测标签的集合例如Seg/Detection模式断裂、油污、划伤...Class模式ok、ng、上面、下面、套环、正常...")]
// [TypeConverter(typeof(CollectionCountConvert))]
// [Editor(typeof(ComplexCollectionEditor<RecongnitionLabel>), typeof(UITypeEditor))]
public List<RecongnitionLabel> RecongnitionLabelList { get; set; } = new List<RecongnitionLabel>();
[Category("深度学习检测配置")]
[DisplayName("标签置信度")]
[Description("标签置信度,过滤小于改置信度的标签,大于该设置的标签才能识别")]
public float Score { get; set; } = 0.5f;
[Category("深度学习检测配置")]
[DisplayName("CPU线程数量")]
[Description("用于深度学习的CPU线程数量不要设置太大会单独占用线程影响其他程序运行")]
public int CPUNums { get; set; } = 1;
//[Category("深度学习检测配置")]
//[DisplayName("检测项GPU指定")]
//[Description("将检测项指定到GPU")]
// [TypeConverter(typeof(CollectionCountConvert))]
// [Editor(typeof(ComplexCollectionEditor<DetectionGPUConfig>), typeof(UITypeEditor))]
// public List<DetectionGPUConfig> DetectionGPUList { get; set; } = new List<DetectionGPUConfig>();
// [Category("数据保存配置")]
//[DisplayName("是否保存检测明细CSV")]
//[Description("是否保存 检测明细CSV")]
//public override bool IsEnableCSV { get; set; } = true;
//[Category("数据保存配置")]
//[DisplayName("是否保存检测图片")]
//[Description("是否保存 检测图片,总开关")]
//public bool IsSaveImage { get; set; } = true;
//[Category("数据保存配置")]
//[Description("检测图片 保存文件夹")]
//[DisplayName("检测图片保存文件夹")]
//[Editor(typeof(FoldDialogEditor), typeof(UITypeEditor))]
//public string ImageSaveDirectory { get; set; } = "D:\\PROJECTS\\X017\\Images";
//[Category("数据保存配置")]
//[Description("检测明细CSV文件夹")]
//[DisplayName("检测明细CSV文件夹")]
//[Editor(typeof(FoldDialogEditor), typeof(UITypeEditor))]
//public string CSVDataPath { get; set; } = "D:\\PROJECTS\\X017\\Images";
}
}

View File

@ -17,9 +17,11 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="AntdUI" Version="1.8.9" />
<PackageReference Include="OpenCvSharp4" Version="4.10.0.20241108" /> <PackageReference Include="OpenCvSharp4" Version="4.10.0.20241108" />
<PackageReference Include="OpenCvSharp4.Extensions" Version="4.10.0.20241108" /> <PackageReference Include="OpenCvSharp4.Extensions" Version="4.10.0.20241108" />
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.10.0.20241108" /> <PackageReference Include="OpenCvSharp4.runtime.win" Version="4.10.0.20241108" />
<PackageReference Include="System.IO.Ports" Version="9.0.3" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -0,0 +1,360 @@
using System;
using System.ComponentModel;
using System.Drawing.Imaging;
using AntdUI;
using DH.Commons.Enums;
using HalconDotNet;
using OpenCvSharp;
namespace DH.Commons.Base
{
public class MatSet
{
public DateTime ImageTime { get; set; } = DateTime.Now;
private string id = "";
public string Id
{
get
{
if (string.IsNullOrWhiteSpace(id))
{
id = ImageTime.ToString("HHmmssfff");
}
return id;
}
set
{
id = value;
}
}
public string CameraId { get; set; }
public Mat _mat { get; set; } = null;
public ImageFormat _imageFormat { get; set; } = ImageFormat.Jpeg;
public virtual void Dispose()
{
_mat?.Dispose();
_mat = null;
}
}
public class CameraBase : NotifyProperty
{
// public LoggerHelper LoggerHelper { get; set; } = new LoggerHelper();
// 私有字段 + 带通知的属性与DetectionLabel风格一致
private bool _isEnabled = false;
private bool _isallPicEnabled = true;//默认全画幅
private bool _isContinueMode = false;
private bool _isSavePicEnabled = false;
private string _imageSaveDirectory;
private EnumCamType _CamType;
private ImageFormat _imageFormat = ImageFormat.Jpeg;
private bool _isHardwareTrigger = true;
private string _serialNumber = string.Empty;
private string _cameraName = string.Empty;
private string _cameraIP = string.Empty;
private string _computerIP = string.Empty;
private bool _isDirectHardwareTrigger = false;
private float _gain =6;
private float _rotateImage = 0;
private float _exposure = 200;
private float _triggerDelay = 0;
private decimal _roiX = 0;
private decimal _roiY = 0;
private decimal _roiW = 2448;
private decimal _roiH = 2048;
private int _lineDebouncerTime = 0;
public volatile int SnapshotCount = 0;
[Category("采图模式")]
[DisplayName("连续模式")]
[Description("是否连续模式。true连续模式采图false触发模式采图")]
public bool IsContinueMode
{
get => _isContinueMode;
set
{
if (_isContinueMode == value) return;
_isContinueMode = value;
OnPropertyChanged(nameof(IsContinueMode));
}
}
public virtual bool IsEnabled
{
get => _isEnabled;
set
{
if (_isEnabled == value) return;
_isEnabled = value;
OnPropertyChanged(nameof(IsEnabled));
}
}
public virtual bool IsAllPicEnabled
{
get => _isallPicEnabled;
set
{
if (_isallPicEnabled == value) return;
_isallPicEnabled = value;
OnPropertyChanged(nameof(IsAllPicEnabled));
}
}
public virtual bool IsSavePicEnabled
{
get => _isSavePicEnabled;
set
{
if (_isSavePicEnabled == value) return;
_isSavePicEnabled = value;
OnPropertyChanged(nameof(IsSavePicEnabled));
}
}
[Category("图片保存")]
[DisplayName("图片保存文件夹")]
[Description("图片保存文件夹")]
public virtual string ImageSaveDirectory
{
get => _imageSaveDirectory;
set
{
if (_imageSaveDirectory == value) return;
_imageSaveDirectory = value;
OnPropertyChanged(nameof(ImageSaveDirectory));
}
}
[Category("图片保存")]
[DisplayName("图片保存格式")]
[Description("图片保存格式")]
public ImageFormat ImageFormat
{
get => _imageFormat;
set
{
if (_imageFormat == value) return;
_imageFormat = value;
OnPropertyChanged(nameof(ImageFormat));
}
}
[Category("设备配置")]
[DisplayName("相机类型")]
[Description("相机类型")]
public EnumCamType CamType
{
get => _CamType;
set
{
if (_CamType == value) return;
_CamType = value;
OnPropertyChanged(nameof(CamType));
}
}
[Category("采图模式")]
[DisplayName("硬触发")]
[Description("是否硬触发模式。true硬触发false软触发")]
public bool IsHardwareTrigger
{
get => _isHardwareTrigger;
set
{
if (_isHardwareTrigger == value) return;
_isHardwareTrigger = value;
OnPropertyChanged(nameof(IsHardwareTrigger));
}
}
public string SerialNumber
{
get => _serialNumber;
set
{
if (_serialNumber == value) return;
_serialNumber = value;
OnPropertyChanged(nameof(SerialNumber));
}
}
public string CameraName
{
get => _cameraName;
set
{
if (_cameraName == value) return;
_cameraName = value;
OnPropertyChanged(nameof(CameraName));
}
}
public string CameraIP
{
get => _cameraIP;
set
{
if (_cameraIP == value) return;
_cameraIP = value;
OnPropertyChanged(nameof(CameraIP));
}
}
public string ComputerIP
{
get => _computerIP;
set
{
if (_computerIP == value) return;
_computerIP = value;
OnPropertyChanged(nameof(ComputerIP));
}
}
[Category("采图模式")]
[DisplayName("是否传感器直接硬触发")]
[Description("是否传感器直接硬触发。true传感器硬触发不通过软件触发false通过软件触发IO 的硬触发模式")]
public bool IsDirectHardwareTrigger
{
get => _isDirectHardwareTrigger;
set
{
if (_isDirectHardwareTrigger == value) return;
_isDirectHardwareTrigger = value;
OnPropertyChanged(nameof(IsDirectHardwareTrigger));
}
}
[Category("相机设置")]
[DisplayName("增益")]
[Description("Gain增益,-1:不设置不同型号相机的增益请参考mvs")]
public float Gain
{
get => _gain;
set
{
if (_gain.Equals(value)) return;
_gain = value;
OnPropertyChanged(nameof(Gain));
}
}
[Category("图像旋转")]
[DisplayName("默认旋转")]
[Description("默认旋转,相机开启后默认不旋转")]
public virtual float RotateImage
{
get => _rotateImage;
set
{
if (_rotateImage.Equals(value)) return;
_rotateImage = value;
OnPropertyChanged(nameof(RotateImage));
}
}
[Category("取像配置")]
[DisplayName("曝光")]
[Description("曝光")]
public virtual float Exposure
{
get => _exposure;
set
{
if (_exposure.Equals(value)) return;
_exposure = value;
OnPropertyChanged(nameof(Exposure));
}
}
[Category("相机设置")]
[DisplayName("硬触发后的延迟")]
[Description("TriggerDelay:硬触发后的延迟,单位us 微秒")]
public float TriggerDelay
{
get => _triggerDelay;
set
{
if (_triggerDelay.Equals(value)) return;
_triggerDelay = value;
OnPropertyChanged(nameof(TriggerDelay));
}
}
public decimal ROIX
{
get => _roiX;
set
{
if (_roiX == value) return;
_roiX = value;
OnPropertyChanged(nameof(ROIX));
}
}
public decimal ROIY
{
get => _roiY;
set
{
if (_roiY == value) return;
_roiY = value;
OnPropertyChanged(nameof(ROIY));
}
}
public decimal ROIW
{
get => _roiW;
set
{
if (_roiW == value) return;
_roiW = value;
OnPropertyChanged(nameof(ROIW));
}
}
public decimal ROIH
{
get => _roiH;
set
{
if (_roiH == value) return;
_roiH = value;
OnPropertyChanged(nameof(ROIH));
}
}
[Category("相机设置")]
[DisplayName("滤波时间")]
[Description("LineDebouncerTimeI/O去抖时间 单位us")]
public int LineDebouncerTime
{
get => _lineDebouncerTime;
set
{
if (_lineDebouncerTime == value) return;
_lineDebouncerTime = value;
OnPropertyChanged(nameof(LineDebouncerTime));
}
}
// 其他方法保持原有逻辑
public Action<DateTime, CameraBase, Mat> OnHImageOutput { get; set; }
public virtual bool CameraConnect() { return false; }
public virtual bool CameraDisConnect() { return false; }
public virtual void SetExposure(int exposureTime, string cameraName) { }
public virtual void SetGain(int gain, string cameraName) { }
internal virtual void SetAcquisitionMode(int mode) { }
internal virtual void SetAcqRegion(int offsetV, int offsetH, int imageH, int imageW, string cameraName) { }
}
}

View File

@ -6,29 +6,14 @@ using System.Text.RegularExpressions;
using System.Text; using System.Text;
using System.Drawing.Design; using System.Drawing.Design;
using AntdUI; using AntdUI;
using System.Text.Json.Serialization;
using static DH.Commons.Enums.EnumHelper; using static DH.Commons.Enums.EnumHelper;
using System.Collections.ObjectModel; using System.Text.Json.Serialization;
using DH.Commons.Enums;
using System.Drawing.Imaging;
namespace DH.Commons.Base
namespace DH.Commons.Enums
{ {
public enum MLModelType
{
[Description("图像分类")]
ImageClassification = 1,
[Description("目标检测")]
ObjectDetection = 2,
//[Description("图像分割")]
//ImageSegmentation = 3
[Description("语义分割")]
SemanticSegmentation = 3,
[Description("实例分割")]
InstanceSegmentation = 4,
[Description("目标检测GPU")]
ObjectGPUDetection = 5
}
public class ModelLabel public class ModelLabel
{ {
public string LabelId { get; set; } public string LabelId { get; set; }
@ -182,7 +167,6 @@ namespace DH.Commons.Enums
public int GPUId; public int GPUId;
public float Score_thre; public float Score_thre;
public MLInit(string modelFile, bool isGPU, int gpuId, float score_thre) public MLInit(string modelFile, bool isGPU, int gpuId, float score_thre)
@ -207,18 +191,32 @@ namespace DH.Commons.Enums
} }
public class DetectStationResult public class DetectStationResult
{ {
public DateTime ImageTime { get; set; } = DateTime.Now;
private string id = "";
public string Id
{
get
{
if (string.IsNullOrWhiteSpace(id))
{
id = ImageTime.ToString("HHmmssfff");
}
return id;
}
set
{
id = value;
}
}
public string Pid { get; set; } public string Pid { get; set; }
public string TempPid { get; set; } public string TempPid { get; set; }
/// <summary> /// <summary>
/// 检测工位名称 /// 检测工位名称
/// </summary> /// </summary>
public string DetectName { get; set; } public string DetectName { get; set; }
@ -228,8 +226,11 @@ namespace DH.Commons.Enums
/// </summary> /// </summary>
public List<DetectionResultDetail> DetectDetails = new List<DetectionResultDetail>(); public List<DetectionResultDetail> DetectDetails = new List<DetectionResultDetail>();
public List<IShapeElement> DetectionResultShapes = new List<IShapeElement>(); public List<IShapeElement> DetectionResultShapes = new List<IShapeElement>();
/// <summary>
/// 视觉测量结果集合
/// </summary>
public List<IndexedSpec> realSpecs { get; set; } = new List<IndexedSpec>();
/// <summary> /// <summary>
/// 工位检测结果 /// 工位检测结果
/// </summary> /// </summary>
@ -254,35 +255,24 @@ namespace DH.Commons.Enums
/// 预处理阶段已经NG /// 预处理阶段已经NG
/// </summary> /// </summary>
public bool IsPreTreatNG { get; set; } = false; public bool IsPreTreatNG { get; set; } = false;
/// <summary>
/// 检测原图
/// </summary>
public Bitmap DetectionOriginImage { get; set; }
/// <summary> /// <summary>
/// 目标检测NG /// 目标检测NG
/// </summary> /// </summary>
public bool IsObjectDetectNG { get; set; } = false; public bool IsObjectDetectNG { get; set; } = false;
public ImageFormat ImageFormat { get; set; } = ImageFormat.Jpeg;
public DateTime EndTime { get; set; } public DateTime EndTime { get; set; }
public string ImageSaveDirectory { get; set; }
public int StationDetectElapsed { get; set; } public int StationDetectElapsed { get; set; }
public static string NormalizeAndClean(string input) public bool SaveOKOriginal = false;
{ public bool SaveNGOriginal = false;
#pragma warning disable CS8603 // 可能返回 null 引用 public bool SaveOKDetect = false;
if (input == null) return null; public bool SaveNGDetect = false;
#pragma warning restore CS8603 // 可能返回 null 引用
// Step 1: 标准化字符编码为 Form C (规范组合)
string normalizedString = input.Normalize(NormalizationForm.FormC);
// Step 2: 移除所有空白字符,包括制表符和换行符
string withoutWhitespace = Regex.Replace(normalizedString, @"\s+", "");
// Step 3: 移除控制字符 (Unicode 控制字符,范围 \u0000 - \u001F 和 \u007F)
string withoutControlChars = Regex.Replace(withoutWhitespace, @"[\u0000-\u001F\u007F]+", "");
// Step 4: 移除特殊的不可见字符(如零宽度空格等)
string cleanedString = Regex.Replace(withoutControlChars, @"[\u200B\u200C\u200D\uFEFF]+", "");
return cleanedString;
}
} }
public class RelatedCamera : NotifyProperty public class RelatedCamera : NotifyProperty
@ -292,7 +282,6 @@ namespace DH.Commons.Enums
[Category("关联相机")] [Category("关联相机")]
[DisplayName("相机源ID")] [DisplayName("相机源ID")]
[Description("关联相机的唯一标识符")] [Description("关联相机的唯一标识符")]
[JsonPropertyName("camera_sourceId")]
//[TypeConverter(typeof(CollectionCountConvert))] //[TypeConverter(typeof(CollectionCountConvert))]
public string CameraSourceId public string CameraSourceId
{ {
@ -406,7 +395,7 @@ namespace DH.Commons.Enums
public static double GetDistance(CustomizedPoint p1, CustomizedPoint p2) public static double GetDistance(CustomizedPoint p1, CustomizedPoint p2)
{ {
return Math.Sqrt(Math.Pow((p1.X - p2.X), 2) + Math.Pow((p1.Y - p2.Y), 2)); return Math.Sqrt(Math.Pow(p1.X - p2.X, 2) + Math.Pow(p1.Y - p2.Y, 2));
} }
public override string ToString() public override string ToString()
@ -447,13 +436,13 @@ namespace DH.Commons.Enums
public int CompareTo(CustomizedPoint other) public int CompareTo(CustomizedPoint other)
{ {
return (X == other.X && Y == other.Y) ? 0 : 1; return X == other.X && Y == other.Y ? 0 : 1;
} }
public override int GetHashCode() public override int GetHashCode()
{ {
//return (int)(X * 10 + Y); //return (int)(X * 10 + Y);
return (new Tuple<double, double>(X, Y)).GetHashCode(); return new Tuple<double, double>(X, Y).GetHashCode();
} }
public static CustomizedPoint operator -(CustomizedPoint p1, CustomizedPoint p2) public static CustomizedPoint operator -(CustomizedPoint p1, CustomizedPoint p2)
@ -476,7 +465,7 @@ namespace DH.Commons.Enums
// [Category("预处理参数")] // [Category("预处理参数")]
// [DisplayName("参数名称")] // [DisplayName("参数名称")]
// [Description("参数名称")] // [Description("参数名称")]
// //#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
// public string Name { get; set; } // public string Name { get; set; }
@ -488,7 +477,7 @@ namespace DH.Commons.Enums
// [Category("预处理参数")] // [Category("预处理参数")]
// [DisplayName("参数值")] // [DisplayName("参数值")]
// [Description("参数值")] // [Description("参数值")]
// //#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
// public string Value { get; set; } // public string Value { get; set; }
@ -496,185 +485,411 @@ namespace DH.Commons.Enums
// } // }
public class DetectionConfig : NotifyProperty public class DetectionConfig : NotifyProperty
{ {
#region #region
[JsonPropertyName("id")] private string _id = Guid.NewGuid().ToString();
private string _name;
private string _cameraSourceId = "";
private List<RelatedCamera> _cameraCollects = new List<RelatedCamera>();
private bool _isEnableGPU;
private bool _isMixModel;
private bool _isPreEnabled;
private bool _isEnabled;
private bool _isAddStation = true;
private string _halconAlgorithemPath_Pre;
private AntList<PreTreatParam> _preTreatParams = new AntList<PreTreatParam>();
private AntList<PreTreatParam> _outPreTreatParams = new AntList<PreTreatParam>();
private ModelType _modelType = ModelType.;
private string _modelPath;
private int _modelWidth = 640;
private int _modelHeight = 640;
private string _modeloutNodeName = "output0";
private float _modelconfThreshold = 0.5f;
private string _in_lable_path;
private AntList<DetectionLable> _detectionLableList = new AntList<DetectionLable>();
private AntList<SizeTreatParam> _sizeTreatParamList = new AntList<SizeTreatParam>();
private CustomizedPoint _showLocation = new CustomizedPoint();
private string _imageSaveDirectory="D://Images";
private bool _saveOKOriginal = false;
private bool _saveNGOriginal = false;
private bool _saveOKDetect = false;
private bool _saveNGDetect = false;
#endregion
#region
[ReadOnly(true)] [ReadOnly(true)]
public string Id { get; private set; } = Guid.NewGuid().ToString(); public string Id
{
get => _id;
set
{
if (_id == value) return;
_id = value;
OnPropertyChanged(nameof(Id));
}
}
[Category("检测配置")] [Category("检测配置")]
[DisplayName("检测配置名称")] [DisplayName("检测配置名称")]
[Description("检测配置名称")] [Description("检测配置名称")]
[JsonPropertyName("name")] public string Name
public string Name { get; set; } {
get => _name;
#endregion set
{
#region if (_name == value) return;
[Category("关联相机")] _name = value;
[DisplayName("关联相机")] OnPropertyChanged(nameof(Name));
[Description("关联相机描述")] }
[JsonPropertyName("camera_source_id")] }
public string CameraSourceId { get; set; } = "";
[Category("关联相机集合")] [Category("关联相机集合")]
[DisplayName("关联相机集合")] [DisplayName("关联相机集合")]
[Description("关联相机描述")] [Description("关联相机描述")]
[JsonPropertyName("camera_Collects")] public List<RelatedCamera> CameraCollects
public List<RelatedCamera> CameraCollects { get; set; } = new(); {
#endregion get => _cameraCollects;
set
{
if (_cameraCollects == value) return;
_cameraCollects = value;
OnPropertyChanged(nameof(CameraCollects));
}
}
#region
[Category("启用配置")] [Category("启用配置")]
[DisplayName("是否启用GPU检测")] [DisplayName("是否启用GPU检测")]
[JsonPropertyName("is_enable_gpu")] [Description("是否启用GPU检测")]
public bool IsEnableGPU { get; set; } public bool IsEnableGPU
{
get => _isEnableGPU;
set
{
if (_isEnableGPU == value) return;
_isEnableGPU = value;
OnPropertyChanged(nameof(IsEnableGPU));
}
}
[Category("启用配置")] [Category("启用配置")]
[DisplayName("是否混料模型")] [DisplayName("是否混料模型")]
[JsonPropertyName("is_mixModel")] [Description("是否混料模型")]
public bool IsMixModel { get; set; } public bool IsMixModel
{
[Category("启用配置")] get => _isMixModel;
[DisplayName("是否启用该检测")] set
[JsonPropertyName("is_enabled")] {
public bool IsEnabled { get; set; } if (_isMixModel == value) return;
_isMixModel = value;
OnPropertyChanged(nameof(IsMixModel));
}
}
[Category("启用配置")] [Category("启用配置")]
[DisplayName("是否启用预处理")] [DisplayName("是否启用预处理")]
[JsonPropertyName("is_PreEnabled")] [Description("是否启用预处理")]
public bool IsPreEnabled { get; set; } public bool IsPreEnabled
// public bool IsAddStation { get; set; } = true; {
get => _isPreEnabled;
set
{
if (_isPreEnabled == value) return;
_isPreEnabled = value;
OnPropertyChanged(nameof(IsPreEnabled));
}
}
[Category("启用配置")]
[DisplayName("是否启用该检测")]
[Description("是否启用该检测")]
public bool IsEnabled
{
get => _isEnabled;
set
{
if (_isEnabled == value) return;
_isEnabled = value;
OnPropertyChanged(nameof(IsEnabled));
}
}
private bool _isAddStation;
[Category("启用配置")] [Category("启用配置")]
[DisplayName("是否加入检测工位")] [DisplayName("是否加入检测工位")]
[JsonPropertyName("is_addstation")] [Description("是否加入检测工位")]
public bool IsAddStation public bool IsAddStation
{ {
get => _isAddStation; get => _isAddStation;
set set
{ {
if (_isAddStation != value) if (_isAddStation == value) return;
{
_isAddStation = value; _isAddStation = value;
OnPropertyChanged(nameof(IsAddStation)); OnPropertyChanged(nameof(IsAddStation));
} }
} }
[Category("图片保存")]
[DisplayName("图片保存文件夹")]
[Description("图片保存文件夹")]
public virtual string ImageSaveDirectory
{
get => _imageSaveDirectory;
set
{
if (_imageSaveDirectory == value) return;
_imageSaveDirectory = value;
OnPropertyChanged(nameof(ImageSaveDirectory));
}
} }
#endregion
#region
[Category("1.预处理(视觉算子)")] [Category("1.预处理(视觉算子)")]
[DisplayName("预处理-算法文件路径")] [DisplayName("预处理-算法文件路径")]
[JsonPropertyName("halcon_algorithemPath_pre")] public string HalconAlgorithemPath_Pre
public string HalconAlgorithemPath_Pre { get; set; } {
get => _halconAlgorithemPath_Pre;
set
{
if (_halconAlgorithemPath_Pre == value) return;
_halconAlgorithemPath_Pre = value;
OnPropertyChanged(nameof(HalconAlgorithemPath_Pre));
}
}
[Category("1.预处理(视觉算子)")] [Category("1.预处理(视觉算子)")]
[DisplayName("预处理-参数列表")] [DisplayName("预处理-参数列表")]
[JsonPropertyName("pre_treatParams")] [Description("预处理-参数列表")]
public List<PreTreatParam> PreTreatParams { get; set; } = new(); public AntList<PreTreatParam> PreTreatParams
[Category("1.预处理(视觉算子)")]
[DisplayName("预处理-输出参数列表")]
[JsonPropertyName("out_preTreatParams")]
public List<PreTreatParam> OUTPreTreatParams { get; set; } = new();
#endregion
#region
[Category("2.中检测(深度学习)")]
[DisplayName("模型类型")]
[JsonPropertyName("model_Type")]
public MLModelType ModelType { get; set; } = MLModelType.ObjectDetection;
[Category("2.中检测(深度学习)")]
[DisplayName("模型文件路径")]
[JsonPropertyName("model_Path")]
public string ModelPath { get; set; }
[Category("2.中检测(深度学习)")]
[DisplayName("模型宽度")]
[JsonPropertyName("model_Width")]
public int ModelWidth { get; set; } = 640;
[Category("2.中检测(深度学习)")]
[DisplayName("模型高度")]
[JsonPropertyName("model_Height")]
public int ModelHeight { get; set; } = 640;
[Category("2.中检测(深度学习)")]
[DisplayName("模型节点名称")]
[JsonPropertyName("model_outNodeName")]
public string ModeloutNodeName { get; set; } = "output0";
[Category("2.中检测(深度学习)")]
[DisplayName("模型置信度")]
[JsonPropertyName("model_confThreshold")]
public float ModelconfThreshold { get; set; } = 0.5f;
[Category("2.中检测(深度学习)")]
[DisplayName("模型标签路径")]
[JsonPropertyName("in_lablepath")]
public string in_lable_path { get; set; }
#endregion
#region
// public List<SizeTreatParam> PreTreatCollects { get; set; } = new();
private List<SizeTreatParam> _preTreatParams = new();
[Category("1.尺寸测量集合")]
[DisplayName("尺寸测量集合")]
[JsonPropertyName("Pre_TreatCollects")]
public List<SizeTreatParam> PreTreatCollects
{ {
get => _preTreatParams; get => _preTreatParams;
set set
{ {
if (_preTreatParams != value) if (_preTreatParams == value) return;
{
_preTreatParams = value; _preTreatParams = value;
OnPropertyChanged(nameof(PreTreatCollects)); OnPropertyChanged(nameof(PreTreatParams));
} }
} }
[Category("1.预处理(视觉算子)")]
[DisplayName("预处理-输出参数列表")]
[Description("预处理-输出参数列表")]
public AntList<PreTreatParam> OUTPreTreatParams
{
get => _outPreTreatParams;
set
{
if (_outPreTreatParams == value) return;
_outPreTreatParams = value;
OnPropertyChanged(nameof(OUTPreTreatParams));
}
} }
#endregion [Category("2.中检测(深度学习)")]
[DisplayName("中检测-模型类型")]
[Description("模型类型ImageClassification-图片分类ObjectDetection目标检测Segmentation-图像分割")]
public ModelType ModelType
{
get => _modelType;
set
{
if (_modelType == value) return;
_modelType = value;
OnPropertyChanged(nameof(ModelType));
}
}
[Category("2.中检测(深度学习)")]
[DisplayName("中检测-模型文件路径")]
[Description("中处理 深度学习模型文件路径")]
public string ModelPath
{
get => _modelPath;
set
{
if (_modelPath == value) return;
_modelPath = value;
OnPropertyChanged(nameof(ModelPath));
}
}
[Category("2.中检测(深度学习)")]
[DisplayName("中检测-模型宽度")]
[Description("中处理-模型宽度")]
public int ModelWidth
{
get => _modelWidth;
set
{
if (_modelWidth == value) return;
_modelWidth = value;
OnPropertyChanged(nameof(ModelWidth));
}
}
[Category("2.中检测(深度学习)")]
[DisplayName("中检测-模型高度")]
[Description("中处理-模型高度")]
public int ModelHeight
{
get => _modelHeight;
set
{
if (_modelHeight == value) return;
_modelHeight = value;
OnPropertyChanged(nameof(ModelHeight));
}
}
[Category("2.中检测(深度学习)")]
[DisplayName("中检测-模型节点名称")]
[Description("中处理-模型节点名称")]
public string ModeloutNodeName
{
get => _modeloutNodeName;
set
{
if (_modeloutNodeName == value) return;
_modeloutNodeName = value;
OnPropertyChanged(nameof(ModeloutNodeName));
}
}
[Category("2.中检测(深度学习)")]
[DisplayName("中检测-模型置信度")]
[Description("中处理-模型置信度")]
public float ModelconfThreshold
{
get => _modelconfThreshold;
set
{
if (_modelconfThreshold == value) return;
_modelconfThreshold = value;
OnPropertyChanged(nameof(ModelconfThreshold));
}
}
[Category("2.中检测(深度学习)")]
[DisplayName("中检测-模型标签路径")]
[Description("中处理-模型标签路径")]
public string In_lable_path
{
get
{
if (string.IsNullOrEmpty(ModelPath) || string.IsNullOrWhiteSpace(ModelPath))
{
return string.Empty;
}
string dir = Path.GetDirectoryName(ModelPath);
string file = $"{Path.GetFileNameWithoutExtension(ModelPath)}.txt";
return Path.Combine(dir, file);
}
set
{
if (_in_lable_path == value) return;
_in_lable_path = value;
OnPropertyChanged(nameof(In_lable_path));
}
}
#region
[Category("4.最终过滤(逻辑过滤)")]
[DisplayName("过滤器集合")]
[JsonPropertyName("detection_filterList")]
public List<DetectionFilter> DetectionFilterList { get; set; } = new();
#endregion
#region
[JsonPropertyName("Detection_LableList")]
public List<DetectionLable> DetectionLableList { get; set; } = new();
[Category("显示配置")] [Category("显示配置")]
[DisplayName("显示位置")] [DisplayName("显示位置")]
[JsonPropertyName("Show_Location")] [Description("检测信息显示位置")]
public CustomizedPoint ShowLocation { get; set; } = new(); public CustomizedPoint ShowLocation
#endregion {
//public event PropertyChangedEventHandler PropertyChanged; get => _showLocation;
set
{
if (_showLocation == value) return;
_showLocation = value;
OnPropertyChanged(nameof(ShowLocation));
}
}
//protected virtual void OnPropertyChanged(string propertyName) /// <summary>
//{ /// 标签集合需确保DetectionLable也实现INotifyPropertyChanged
// PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); /// </summary>
//} public AntList<DetectionLable> DetectionLableList
{
get => _detectionLableList;
set
{
if (_detectionLableList == value) return;
_detectionLableList = value;
OnPropertyChanged(nameof(DetectionLableList));
}
}
public AntList<SizeTreatParam> SizeTreatParamList
{
get => _sizeTreatParamList;
set
{
if (_sizeTreatParamList == value) return;
_sizeTreatParamList = value;
OnPropertyChanged(nameof(SizeTreatParamList));
}
}
public bool SaveOKOriginal
{
get => _saveOKOriginal;
set
{
if (_saveOKOriginal == value) return;
_saveOKOriginal = value;
OnPropertyChanged(nameof(SaveOKOriginal));
}
}
public bool SaveNGOriginal
{
get => _saveNGOriginal;
set
{
if (_saveNGOriginal == value) return;
_saveNGOriginal = value;
OnPropertyChanged(nameof(SaveNGOriginal));
}
}
public bool SaveOKDetect
{
get => _saveOKDetect;
set
{
if (_saveOKDetect == value) return;
_saveOKDetect = value;
OnPropertyChanged(nameof(SaveOKDetect));
}
}
public bool SaveNGDetect
{
get => _saveNGDetect;
set
{
if (_saveNGDetect == value) return;
_saveNGDetect = value;
OnPropertyChanged(nameof(SaveNGDetect));
}
}
#endregion
#region #region
public DetectionConfig() { } public DetectionConfig() { }
public DetectionConfig(string name, MLModelType modelType, string modelPath, bool isEnableGPU, string sCameraSourceId) public DetectionConfig(
string name,
ModelType modelType,
string modelPath,
bool isEnableGPU,
string sCameraSourceId)
{ {
// 通过属性赋值触发通知
ModelPath = modelPath ?? string.Empty;
Name = name; Name = name;
ModelType = modelType; ModelType = modelType;
ModelPath = modelPath ?? string.Empty;
IsEnableGPU = isEnableGPU; IsEnableGPU = isEnableGPU;
CameraSourceId = sCameraSourceId;
Id = Guid.NewGuid().ToString();
} }
#endregion #endregion
} }
@ -688,7 +903,6 @@ namespace DH.Commons.Enums
private bool _selected = false; private bool _selected = false;
public bool Selected public bool Selected
{ {
get { return _selected; } get { return _selected; }
@ -699,7 +913,6 @@ namespace DH.Commons.Enums
OnPropertyChanged(nameof(Selected)); OnPropertyChanged(nameof(Selected));
} }
} }
[JsonPropertyName("name")]
private string _name; private string _name;
public string Name public string Name
{ {
@ -714,7 +927,6 @@ namespace DH.Commons.Enums
private string _value; private string _value;
[JsonPropertyName("value")]
public string Value public string Value
{ {
get { return _value; } get { return _value; }
@ -727,11 +939,10 @@ namespace DH.Commons.Enums
} }
private CellLink[] cellLinks; private CellLink[] cellLinks;
[JsonIgnore]
public CellLink[] CellLinks public CellLink[] CellLinks
{ {
get { get { return cellLinks; }
return cellLinks; }
set set
{ {
if (cellLinks == value) return; if (cellLinks == value) return;
@ -747,10 +958,11 @@ namespace DH.Commons.Enums
public class DetectionLable : NotifyProperty public class DetectionLable : NotifyProperty
{ {
private bool _selected = false; private bool _selected = false;
private string _labelId; private string _labelId;
private string _labelName; private string _labelName;
private double _maxSource; private double _maxScore;
private double _minSource; private double _minScore;
private double _maxArea; private double _maxArea;
private double _minArea; private double _minArea;
private ResultState _resultState = ResultState.ResultTBD; private ResultState _resultState = ResultState.ResultTBD;
@ -770,7 +982,7 @@ namespace DH.Commons.Enums
} }
[JsonPropertyName("labelId")]
public string LabelId public string LabelId
{ {
get { return _labelId; } get { return _labelId; }
@ -781,7 +993,7 @@ namespace DH.Commons.Enums
OnPropertyChanged(nameof(LabelId)); OnPropertyChanged(nameof(LabelId));
} }
} }
[JsonPropertyName("labelName")]
public string LabelName public string LabelName
{ {
get { return _labelName; } get { return _labelName; }
@ -792,30 +1004,29 @@ namespace DH.Commons.Enums
OnPropertyChanged(nameof(LabelName)); OnPropertyChanged(nameof(LabelName));
} }
} }
[JsonPropertyName("maxSource")]
public double MaxSource public double MaxScore
{ {
get { return _maxSource; } get { return _maxScore; }
set set
{ {
if (_maxSource.Equals(value)) return; if (_maxScore.Equals(value)) return;
_maxSource = value; _maxScore = value;
OnPropertyChanged(nameof(MaxSource)); OnPropertyChanged(nameof(MaxScore));
} }
} }
[JsonPropertyName("minSource")] public double MinScore
public double MinSource
{ {
get { return _minSource; } get { return _minScore; }
set set
{ {
if (_minSource.Equals(value)) return; if (_minScore.Equals(value)) return;
_minSource = value; _minScore = value;
OnPropertyChanged(nameof(MinSource)); OnPropertyChanged(nameof(MinScore));
} }
} }
[JsonPropertyName("maxArea")]
public double MaxArea public double MaxArea
{ {
get { return _maxArea; } get { return _maxArea; }
@ -826,7 +1037,7 @@ namespace DH.Commons.Enums
OnPropertyChanged(nameof(MaxArea)); OnPropertyChanged(nameof(MaxArea));
} }
} }
[JsonPropertyName("minArea")]
public double MinArea public double MinArea
{ {
get { return _minArea; } get { return _minArea; }
@ -837,7 +1048,7 @@ namespace DH.Commons.Enums
OnPropertyChanged(nameof(MinArea)); OnPropertyChanged(nameof(MinArea));
} }
} }
[JsonPropertyName("_resultState")]
public ResultState ResultState public ResultState ResultState
{ {
get { return _resultState; } get { return _resultState; }
@ -850,11 +1061,10 @@ namespace DH.Commons.Enums
} }
private CellLink[] cellLinks; private CellLink[] cellLinks;
[JsonIgnore]
public CellLink[] CellLinks public CellLink[] CellLinks
{ {
get { get { return cellLinks; }
return cellLinks; }
set set
{ {
if (cellLinks == value) return; if (cellLinks == value) return;
@ -863,60 +1073,6 @@ namespace DH.Commons.Enums
} }
} }
} }
public class PreTreatCollect
{
[Category("尺寸测量集合")]
[DisplayName("预处理-算法文件路径")]
[Description("预处理算法文件路径配置")]
[JsonPropertyName("halconPath_Pre")]
// [Editor(typeof(FileDialogEditor), typeof(UITypeEditor))]
public string HalconPath_Pre { get; set; }
[Category("尺寸测量集合")]
[DisplayName("输入参数列表")]
[Description("输入参数列表")]
[JsonPropertyName("preParams")]
// [TypeConverter(typeof(CollectionCountConvert))]
// [Editor(typeof(ComplexCollectionEditor<PreTreatParam>), typeof(UITypeEditor))]
public List<PreTreatParam> PreParams { get; set; } = new List<PreTreatParam>();
[Category("尺寸测量集合")]
[DisplayName("输出参数列表")]
[Description("输出参数列表")]
[JsonPropertyName("outPreParams")]
// [TypeConverter(typeof(CollectionCountConvert))]
// [Editor(typeof(ComplexCollectionEditor<PreTreatParam>), typeof(UITypeEditor))]
public List<PreTreatParam> outPreParams { get; set; } = new List<PreTreatParam>();
[Category("尺寸测量集合")]
[DisplayName("预处理-名称")]
[Description("预处理名称")]
[JsonPropertyName("preName")]
public string PreName { get; set; }
[Category("尺寸测量集合")]
[DisplayName("预处理-启用")]
[Description("预处理启用")]
[JsonPropertyName("preIsEnable")]
public bool PreIsEnable { get; set; } = false;
[Category("尺寸测量集合")]
[DisplayName("类型")]
[Description("类型")]
[JsonPropertyName("preType")]
// [TypeConverter(typeof(EnumDescriptionConverter<SizeEnum>))]
public SizeEnum PreType { get; set; }
[Category("尺寸测量集合")]
[DisplayName("阈值")]
[Description("阈值")]
[JsonPropertyName("prePix")]
public int PrePix { get; set; }
}
public class SizeTreatParam : NotifyProperty public class SizeTreatParam : NotifyProperty
{ {
@ -1013,19 +1169,20 @@ namespace DH.Commons.Enums
} }
} }
//public string PrePath public string PrePath
//{ {
// get { return _prePath; } get { return _prePath; }
// set set
// { {
// if (_prePath.Equals(value)) return; if (_prePath.Equals(value)) return;
// _prePath = value; _prePath = value;
// OnPropertyChanged(nameof(PrePath)); OnPropertyChanged(nameof(PrePath));
// } }
//} }
private CellLink[] cellLinks; private CellLink[] cellLinks;
[JsonIgnore]
public CellLink[] CellLinks public CellLink[] CellLinks
{ {
get { return cellLinks; } get { return cellLinks; }
@ -1077,7 +1234,7 @@ namespace DH.Commons.Enums
[DisplayName("检测项标签")] [DisplayName("检测项标签")]
[Description("检测标签Id")] [Description("检测标签Id")]
//[TypeConverter(typeof(DetectionLabelConverter))] //[TypeConverter(typeof(DetectionLabelConverter))]
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public string LabelId { get; set; } public string LabelId { get; set; }

View File

@ -0,0 +1,389 @@

using DH.Commons.Enums;
using OpenCvSharp.Internal;
using System;
using System.ComponentModel;
using System.IO;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using static DH.Commons.Enums.EnumHelper;
using Timer = System.Threading.Timer;
namespace DH.Commons.Base
{
public abstract class DeviceBase : IDisposable
{
#region Event
[JsonIgnore]
[Browsable(false)]
public Action<DateTime, Exception> OnExceptionOccured { get; set; }
//public event Action<DateTime, LogLevel, string> OnLog;
public event Action<LogMsg> OnLog;
// public event Action<IDevice, DeviceState> OnDeviceStateChanged;
public event PropertyChangedEventHandler PropertyChanged;
#endregion
#region field
int RetryTime = 3;
/// <summary>
/// 和设备暂停状态关联的信号量
/// </summary>
private readonly ManualResetEvent pauseHandle = new ManualResetEvent(true);
readonly Timer stateChangedTimer;
#endregion
#region Property
#region State
private EnumHelper.DeviceState _currentStateToBe = EnumHelper.DeviceState.DSUninit;
/// <summary>
/// 当前设备状态
/// </summary>
[JsonIgnore]
internal EnumHelper.DeviceState CurrentStateToBe
{
get
{
return _currentStateToBe;
}
set
{
if (value != _currentStateToBe)
{
var initialState = _currentStateToBe;
_currentStateToBe = value;
if (_currentStateToBe != EnumHelper.DeviceState.DSExcept)
{
// OnStateChanged(initialState);
}
else
{
stateChangedTimer.Change(Timeout.Infinite, Timeout.Infinite);
}
}
}
}
//private EnumHelper.DeviceState initialState = EnumHelper.DeviceState.DSUninit;
private EnumHelper.DeviceState _currentState = EnumHelper.DeviceState.DSUninit;
public EnumHelper.DeviceState CurrentState
{
get
{
return _currentState;
}
set
{
_currentState = value;
if (value != EnumHelper.DeviceState.TBD)
{
// OnDeviceStateChanged?.Invoke(this, _currentState);
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("CurrentState"));
}
//else
//{
// initialState = _currentState;
//}
}
}
#endregion
/// <summary>
/// 设备标识符 从数据库获取
/// </summary>
public string Id { get; set; }
/// <summary>
/// 设备名称 从数据库获取
/// </summary>
public string Name { get; set; }
//private IInitialConfig initialConfig = null;
///// <summary>
///// 设备初始化配置 从数据库获取
///// </summary>
//public virtual IInitialConfig InitialConfig
//{
// get => initialConfig;
// set
// {
// initialConfig = value;
// Id = initialConfig.Id;
// Name = initialConfig.Name;
// LoggerHelper.LogPath = initialConfig.LogPath;
// LoggerHelper.LogPrefix = initialConfig.Name;
// }
//}
#endregion
#region
public DeviceBase()
{
RegisterFileWriterException();
// stateChangedTimer = new Timer(new TimerCallback(CheckDeviceOpTimeOut), null, Timeout.Infinite, Timeout.Infinite);
}
#endregion
#region
protected virtual void Init()
{
LogAsync(DateTime.Now, LogLevel.Information, $"{Name}初始化完成");
}
protected virtual void Start()
{
LogAsync(DateTime.Now, LogLevel.Information, $"{Name}启动");
}
protected virtual void Stop()
{
LogAsync(DateTime.Now, LogLevel.Information, $"{Name}停止");
}
//public abstract void AttachToProcess(IProcess process);
#endregion
/// <summary>
/// 常用操作封装方法
/// </summary>
/// <param name="opConfig"></param>
/// <returns></returns>
//public virtual ResponseMessage RunWrap(IOperationConfig opConfig)
//{
// ResponseMessage msg = new ResponseMessage();
// msg.Message = "设备基类默认操作";
// return msg;
//}
#region
//[DeviceExceptionAspect]
//public void StateChange(EnumHelper.DeviceState stateToBe)
//{
// if (CurrentState == stateToBe)
// {
// return;
// }
// if (!stateToBe.CheckPreStateValid((int)CurrentStateToBe))
// {
// string currentStateStr = CurrentStateToBe.GetEnumDescription();
// string stateToBeStr = stateToBe.GetEnumDescription();
// throw new ProcessException($"{InitialConfig.Name}设备的当前状态为{currentStateStr},无法切换至{stateToBeStr}");
// }
// CurrentState = EnumHelper.DeviceState.TBD;
// CurrentStateToBe = stateToBe;
//}
//[DeviceExceptionAspect]
//private void OnStateChanged(EnumHelper.DeviceState initialState)
//{
// try
// {
// if (CurrentStateToBe != EnumHelper.DeviceState.DSExcept)
// {
// }
// else
// {
// if (CurrentState == EnumHelper.DeviceState.DSExcept)
// {
// return;
// }
// else
// {
// throw new ProcessException($"{InitialConfig.Name}设备操作超时");
// }
// }
// if (RetryTime >= 0)
// {
// if (initialState == CurrentStateToBe)
// {
// CurrentState = CurrentStateToBe;
// return;
// }
// #region 状态切换操作
// switch (CurrentStateToBe)
// {
// case EnumHelper.DeviceState.DSInit:
// if (initialState == EnumHelper.DeviceState.DSOpen)
// {
// return;
// }
// else
// {
// Init();
// }
// break;
// case EnumHelper.DeviceState.DSOpen:
// if (initialState == EnumHelper.DeviceState.DSInit)
// {
// Start();
// }
// else if (initialState == EnumHelper.DeviceState.DSPause)
// {
// Resume();
// pauseHandle.Set();
// }
// break;
// case EnumHelper.DeviceState.DSPause:
// pauseHandle.Reset();
// Pause();
// break;
// case EnumHelper.DeviceState.DSClose:
// if (initialState != DeviceState.DSUninit)
// {
// Stop();
// }
// break;
// default:
// break;
// }
// RetryTime = 3;
// CurrentState = CurrentStateToBe;
// #endregion
// }
// stateChangedTimer.Change(Timeout.Infinite, Timeout.Infinite);
// }
// catch (Exception ex)
// {
// RetryTime--;
// if (RetryTime > 0)
// {
// OnStateChanged(initialState);
// }
// else
// {
// if (CurrentState != EnumHelper.DeviceState.DSExcept)
// {
// RetryTime = 3;
// throw new ProcessException($"设备{InitialConfig.Name}的{CurrentStateToBe.GetEnumDescription()}操作重复3次失败", ex, ExceptionLevel.Warning);
// }
// }
// }
//}
//private void CheckDeviceOpTimeOut(object state)
//{
// stateChangedTimer?.Change(Timeout.Infinite, Timeout.Infinite);
// if (CurrentState != EnumHelper.DeviceState.DSExcept)
// {
// StateChange(EnumHelper.DeviceState.DSExcept);
// }
//}
#endregion
#region
private void RegisterFileWriterException()
{
LoggerHelper.OnLogExceptionRaised -= LoggerHelper_OnLogExceptionRaised;
// CSVHelper.OnCSVExceptionRaised -= LoggerHelper_OnLogExceptionRaised;
LoggerHelper.OnLogExceptionRaised += LoggerHelper_OnLogExceptionRaised;
// CSVHelper.OnCSVExceptionRaised += LoggerHelper_OnLogExceptionRaised;
}
// public CSVHelper CSVHelper { get; set; } = new CSVHelper();
public LoggerHelper LoggerHelper { get; set; } = new LoggerHelper();
public virtual void LogAsync(LogMsg msg)
{
msg.MsgSource = Name;
msg.ThreadId = Thread.CurrentThread.ManagedThreadId;
//OnLog?.BeginInvoke(msg, null, null);
OnLog?.Invoke(msg);
//if (InitialConfig.IsEnableLog)
//{
// LoggerHelper.LogAsync(msg);
//}
}
public virtual void LogAsync(DateTime dt, LogLevel logLevel, string msg)
{
LogAsync(new LogMsg(dt, logLevel, msg));
}
private void LoggerHelper_OnLogExceptionRaised(DateTime dt, string msg)
{
OnLog?.Invoke(new LogMsg(dt, LogLevel.Error, msg));
}
/// <summary>
/// CSV异步数据输出
/// </summary>
/// <param name="csvFile">CSV输出文件的文件全路径</param>
/// <param name="csvData">CSV输出数据</param>
/// <param name="csvHead">CSV文件表头</param>
public virtual void CSVRecordAsync(string csvFile, string csvData, string csvHead = "")
{
// CSVHelper.CSVOutputAsync(csvFile, csvData, csvHead);
}
#endregion
#region
//object _alarmLock = new object();
//protected virtual async void SaveAlarmCSVAsync(DateTime now, string deviceName, IWarningSet ws)
//{
// await Task.Run(() =>
// {
// LogAsync(now, LogLevel.Warning, $"{ws.WarningCode}-{ws.WarningDescription} {(ws.CurrentStatus ? "发生" : "取消")}");
// if (string.IsNullOrWhiteSpace(this.InitialConfig.LogPath) || !InitialConfig.IsEnableCSV)
// return;
// string path = Path.Combine(InitialConfig.LogPath, $"Alarm_{Name}_{now.ToString("yyyyMMdd")}.csv");
// string head = "Time,Source,AlarmCode,AlarmDescription,AlarmStatus";
// string data = $"{now.ToString("HH:mm:ss.fff")},{deviceName},{ws.WarningCode},{ws.WarningDescription},{(ws.CurrentStatus ? "报警发生" : "报警取消")}";
// CSVRecordAsync(path, data, head);
// });
//}
#endregion
#region IDisposable Support
private bool disposedValue = false; // 要检测冗余调用
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
//释放托管状态(托管对象)。
stateChangedTimer?.Dispose();
pauseHandle?.Dispose();
}
// TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
// TODO: 将大型字段设置为 null。
disposedValue = true;
}
}
// TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
// ~DeviceBase()
// {
// // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
// Dispose(false);
// }
// 添加此代码以正确实现可处置模式。
public void Dispose()
{
// 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
Dispose(true);
// TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
// GC.SuppressFinalize(this);
}
#endregion
}
}

View File

@ -0,0 +1,131 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using AntdUI;
namespace DH.Commons.Base
{
public class GlobalConfig : NotifyProperty
{
string _name;
private BindingList<PLCItem> _InitProcessList = new BindingList<PLCItem>();
private BindingList<PLCItem> _StartProcessList = new BindingList<PLCItem>();
private BindingList<PLCItem> _StopProcessList = new BindingList<PLCItem>();
private BindingList<PLCItem> _StartResetList = new BindingList<PLCItem>();
private BindingList<PLCItem> _StopResetList = new BindingList<PLCItem>();
public string Name
{
get => _name;
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged(nameof(Name));
}
}
}
public BindingList<PLCItem> InitProcessList
{
get => _InitProcessList;
set
{
if (_InitProcessList == value) return;
_InitProcessList = value;
OnPropertyChanged(nameof(InitProcessList));
}
}
public BindingList<PLCItem> StartProcessList
{
get => _StartProcessList;
set
{
if (_StartProcessList == value) return;
_StartProcessList = value;
OnPropertyChanged(nameof(StartProcessList));
}
}
public BindingList<PLCItem> StopProcessList
{
get => _StopProcessList;
set
{
if (_StopProcessList == value) return;
_StopProcessList = value;
OnPropertyChanged(nameof(StopProcessList));
}
}
public BindingList<PLCItem> StartResetList
{
get => _StartResetList;
set
{
if (_StartResetList == value) return;
_StartResetList = value;
OnPropertyChanged(nameof(StartResetList));
}
}
public BindingList<PLCItem> StopResetList
{
get => _StopResetList;
set
{
if (_StopResetList == value) return;
_StopResetList = value;
OnPropertyChanged(nameof(StopResetList));
}
}
string _imgSavePath;
string _dbSavePath;
string _configSavePath;
public string ImgSavePath
{
get => _imgSavePath;
set
{
if (_imgSavePath != value)
{
_imgSavePath = value;
OnPropertyChanged(nameof(ImgSavePath));
}
}
}
public string DbSavePath
{
get => _dbSavePath;
set
{
if (_dbSavePath != value)
{
_dbSavePath = value;
OnPropertyChanged(nameof(DbSavePath));
}
}
}
public string ConfigSavePath
{
get => _configSavePath;
set
{
if (_configSavePath != value)
{
_configSavePath = value;
OnPropertyChanged(nameof(ConfigSavePath));
}
}
}
}
}

378
DH.Commons/Base/PLCBase.cs Normal file
View File

@ -0,0 +1,378 @@
using System.ComponentModel;
using System.IO.Ports;
using System.Text.Json.Serialization;
using AntdUI;
using DH.Commons.Enums; // 请确保此命名空间包含EnumPLCType
namespace DH.Commons.Base
{
public class PLCBase : NotifyProperty
{
// 私有字段
private bool _enable;
private bool _connected;
private string _plcName;
private EnumPLCType _plcType;
private string _com = "COM1";
private int _baudRate = 9600;
private int _dataBit = 8;
private StopBits _stopBit = StopBits.One;
private Parity _parity = Parity.None;
private string _ip = "192.168.6.61";
private int _port = 502;
private BindingList<PLCItem> _PLCItemList = new BindingList<PLCItem>();
[Category("设备配置")]
[DisplayName("是否启用")]
[Description("是否启用")]
public bool Enable
{
get => _enable;
set
{
if (_enable == value) return;
_enable = value;
OnPropertyChanged(nameof(Enable));
}
}
[Category("状态监控")]
[DisplayName("连接状态")]
[Description("PLC连接状态")]
public bool Connected
{
get => _connected;
set
{
if (_connected == value) return;
_connected = value;
OnPropertyChanged(nameof(Connected));
}
}
[Category("设备配置")]
[DisplayName("PLC名称")]
[Description("PLC设备名称")]
public string PLCName
{
get => _plcName;
set
{
if (_plcName == value) return;
_plcName = value;
OnPropertyChanged(nameof(PLCName));
}
}
[Category("设备配置")]
[DisplayName("PLC类型")]
[Description("PLC通信协议类型")]
public EnumPLCType PLCType
{
get => _plcType;
set
{
if (_plcType == value) return;
_plcType = value;
OnPropertyChanged(nameof(PLCType));
}
}
[Category("串口配置")]
[DisplayName("COM端口")]
[Description("串口号如COM1")]
public string COM
{
get => _com;
set
{
if (_com == value) return;
_com = value;
OnPropertyChanged(nameof(COM));
}
}
[Category("串口配置")]
[DisplayName("波特率")]
[Description("串口通信波特率")]
public int BaudRate
{
get => _baudRate;
set
{
if (_baudRate == value) return;
_baudRate = value;
OnPropertyChanged(nameof(BaudRate));
}
}
[Category("串口配置")]
[DisplayName("数据位")]
[Description("数据位长度(5/6/7/8)")]
public int DataBit
{
get => _dataBit;
set
{
if (_dataBit == value) return;
_dataBit = value;
OnPropertyChanged(nameof(DataBit));
}
}
[Category("串口配置")]
[DisplayName("停止位")]
[Description("停止位设置")]
public StopBits StopBit
{
get => _stopBit;
set
{
if (_stopBit == value) return;
_stopBit = value;
OnPropertyChanged(nameof(StopBit));
}
}
[Category("串口配置")]
[DisplayName("校验位")]
[Description("奇偶校验方式")]
public Parity Parity
{
get => _parity;
set
{
if (_parity == value) return;
_parity = value;
OnPropertyChanged(nameof(Parity));
}
}
[Category("网络配置")]
[DisplayName("IP地址")]
[Description("PLC网络地址")]
public string IP
{
get => _ip;
set
{
if (_ip == value) return;
_ip = value;
OnPropertyChanged(nameof(IP));
}
}
[Category("网络配置")]
[DisplayName("端口号")]
[Description("网络通信端口")]
public int Port
{
get => _port;
set
{
if (_port == value) return;
_port = value;
OnPropertyChanged(nameof(Port));
}
}
[Category("点位配置")]
[DisplayName("点位配置")]
[Description("点位配置")]
public BindingList<PLCItem> PLCItemList
{
get => _PLCItemList;
set
{
if (_PLCItemList == value) return;
_PLCItemList = value;
OnPropertyChanged(nameof(PLCItemList));
}
}
public virtual bool PLCConnect()
{
Connected = true;
return true;
}
public virtual bool PLCDisConnect()
{
Connected = false;
return true;
}
public virtual Int16 ReadInt16(string address) { return 0; }
public virtual Int32 ReadInt32(string address) { return 0; }
public virtual UInt16 ReadUInt16(string address) { return 0; }
public virtual UInt32 ReadUInt32(string address) { return 0; }
public virtual float ReadFloat(string address) { return 0; }
public virtual bool ReadBool(string address) { return false; }
public virtual bool WriteInt16(string address, Int16 value, bool waitForReply = true) { return false; }
public virtual bool WriteInt32(string address, Int32 value, bool waitForReply = true) { return false; }
public virtual bool WriteUInt16(string address, UInt16 value, bool waitForReply = true) { return false; }
public virtual bool WriteUInt32(string address, UInt32 value, bool waitForReply = true) { return false; }
public virtual bool WriteFloat(string address, float value, bool waitForReply = true) { return false; }
public virtual bool WriteBool(string address, bool value, bool waitForReply = true) { return false; }
}
public class PLCItem : NotifyProperty
{
private bool _selected;
private string _name = string.Empty;
private EnumPLCDataType _type;
private string _value = string.Empty;
private bool _startexecute;
private int _startindex;
private string _address;
/// <summary>
/// 是否选中
/// </summary>
public bool Selected
{
get => _selected;
set
{
if (_selected != value)
{
_selected = value;
OnPropertyChanged(nameof(Selected));
}
}
}
/// <summary>
/// 参数名称
/// </summary>
public string Name
{
get => _name;
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged(nameof(Name));
}
}
}
public EnumPLCDataType Type
{
get => _type;
set
{
if (_type != value)
{
_type = value;
OnPropertyChanged(nameof(Type));
}
}
}
/// <summary>
/// 参数类型
/// </summary>
public string Address
{
get => _address;
set
{
if (_address != value)
{
_address = value;
OnPropertyChanged(nameof(Address));
}
}
}
/// <summary>
/// 参数值
/// </summary>
public string Value
{
get => _value;
set
{
if (_value != value)
{
_value = value;
OnPropertyChanged(nameof(Value));
}
}
}
/// <summary>
/// 启用状态
/// </summary>
public bool StartExecute
{
get => _startexecute;
set
{
if (_startexecute != value)
{
_startexecute = value;
OnPropertyChanged(nameof(StartExecute));
}
}
}
/// <summary>
/// 顺序
/// </summary>
public int StartIndex
{
get => _startindex;
set
{
if (_startindex != value)
{
_startindex = value;
OnPropertyChanged(nameof(StartIndex));
}
}
}
private CellLink[] cellLinks;
[JsonIgnore]
public CellLink[] CellLinks
{
get { return cellLinks; }
set
{
if (cellLinks == value) return;
cellLinks = value;
OnPropertyChanged(nameof(CellLinks));
}
}
//private CellTag[] cellTags;
//[JsonIgnore]
//public CellTag[] CellTags
//{
// get { return cellTags; }
// set
// {
// if (cellTags == value) return;
// cellTags = value;
// OnPropertyChanged(nameof(CellTags));
// }
//}
}
}

View File

@ -0,0 +1,78 @@
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Imaging;
using DH.Commons.Enums;
using DH.Commons.Helper;
using HalconDotNet;
using OpenCvSharp;
namespace DH.Commons.Base
{
/// <summary>
/// 视觉处理引擎1.传统视觉 2.深度学习
/// CV深度学习 四大领域
/// Image Classification 图像分类:判别图中物体是什么,比如是猫还是狗;
/// Semantic Segmentation 语义分割:对图像进行像素级分类,预测每个像素属于的类别,不区分个体;
/// Object Detection 目标检测:寻找图像中的物体并进行定位;
/// Instance Segmentation 实例分割:定位图中每个物体,并进行像素级标注,区分不同个体;
/// </summary>
public abstract class VisionEngineBase : DeviceBase
{
public List<DetectionConfig> DetectionConfigs = new List<DetectionConfig>();
#region event
public event Action<string, List<double>> OnCropParamsOutput;
public event Action<string, Bitmap, List<IShapeElement>> OnDetectionDone;
public event Action<string> OnDetectionWarningStop;//有无检测 需要报警停机
#endregion
//public VisionEngineInitialConfigBase IConfig
//{
// get => InitialConfig as VisionEngineInitialConfigBase;
//}
// public ImageSaveHelper ImageSaveHelper { get; set; } = new ImageSaveHelper();
public string BatchNO { get; set; }
public HTuple hv_ModelID;
public abstract DetectStationResult RunInference(Mat originImgSet, string detectionId = null);
//public abstract void SaveDetectResultAsync(DetectStationResult detectResult);
public virtual void DetectionDone(string detectionId, Bitmap image, List<IShapeElement> detectionResults)
{
OnDetectionDone?.Invoke(detectionId, image, detectionResults);
}
public virtual void DetectionWarningStop(string detectionDes)
{
OnDetectionWarningStop?.Invoke(detectionDes);
}
public ImageSaveHelper ImageSaveHelper { get; set; } = new ImageSaveHelper();
public virtual void SaveImageAsync(string fullname, Bitmap saveMap, ImageFormat imageFormat)
{
if (saveMap != null)
{
ImageSaveSet imageSaveSet = new ImageSaveSet()
{
FullName = fullname,
SaveImage = saveMap.CopyBitmap(),
ImageFormat = imageFormat.DeepSerializeClone()
};
ImageSaveHelper.ImageSaveAsync(imageSaveSet);
}
}
}
}

View File

@ -13,12 +13,13 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="AntdUI" Version="1.8.9" /> <PackageReference Include="AntdUI" Version="1.8.9" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="OpenCvSharp4" Version="4.10.0.20241108" /> <PackageReference Include="OpenCvSharp4" Version="4.10.0.20241108" />
<PackageReference Include="OpenCvSharp4.Extensions" Version="4.10.0.20241108" /> <PackageReference Include="OpenCvSharp4.Extensions" Version="4.10.0.20241108" />
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.10.0.20241108" /> <PackageReference Include="OpenCvSharp4.runtime.win" Version="4.10.0.20241108" />
<PackageReference Include="System.IO.Ports" Version="9.0.3" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -1,16 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.Commons.Enums
{
public class CameraInfo
{
public string CamName { get; set; }
public string Serinum { get; set; }
public string IP { get; set; }
}
}

View File

@ -7,12 +7,61 @@ using System.Threading.Tasks;
namespace DH.Commons.Enums namespace DH.Commons.Enums
{ {
public enum EnumStatus
{
,
,
,
}
public enum ModelType
{
= 1,
= 2,
= 3,
= 4,
GPU = 5
}
public enum SelectPicType
{
[Description("训练图片")]
train = 0,
[Description("测试图片")]
test
}
public enum NetModel
{
[Description("目标检测")]
training = 0,
[Description("语义分割")]
train_seg,
[Description("模型导出")]
emport,
[Description("推理预测")]
infernce
}
public enum EnumCamType
{
[Description("度申相机")]
Do3think = 0,
[Description("海康相机")]
hik ,
}
public enum EnumPLCType public enum EnumPLCType
{ {
XC_串口, [Description("信捷XC串口")]
XC_网口, XC串口 = 0,
XD_串口, [Description("信捷XC网口")]
XD_网口 XC网口 = 1,
[Description("信捷XD串口")]
XD串口 = 2,
[Description("信捷XD网口")]
XD网口 = 3
} }
@ -28,35 +77,70 @@ namespace DH.Commons.Enums
public enum EnumPLCOutputIO public enum EnumPLCOutputIO
{ {
=0, =0,
=1, ,
使=2, 使,
=3, ,
=4, ,
绿=5, 绿,
=6, ,
=7, ,
=8, ,
=9, ,
=10, ,
1=11, 1,
2=12, 2,
3=13, 3,
4=14, 4,
5=15, 5,
OK料盒=16, 6 ,
NG料盒=17, 7 ,
OK吹气时间=18, 8 ,
NG吹气时间=19, 9 ,
=20, 10 ,
=21, ,
=22, ,
=23, ,
=24, ,
=25 ,
,
,
,
,
,
,
,
,
,
OK脉冲,
NG脉冲,
,
,
} }
public enum EnumPLCDataType
{
,
,
,
}
public enum EnumBool
{
,
}
public enum EnumBool1
{
False,
True
}
public enum StreamFormat public enum StreamFormat
{ {
[Description("8位图像")] [Description("8位图像")]
@ -542,5 +626,15 @@ namespace DH.Commons.Enums
//[Description("插补模式")] //[Description("插补模式")]
//Coordinate = 11 //Coordinate = 11
} }
public enum CameraAcquisitionMode
{
=0,
=1
}
public enum CameraTriggerMode
{
= 0,
= 1
}
} }

View File

@ -0,0 +1,64 @@
using System;
using static DH.Commons.Enums.EnumHelper;
namespace DH.Commons.Helper
{
public enum ExceptionLevel
{
Info = 0,
Warning = 1,
Fatal = 2,
}
//public delegate void OnProcessExceptionRaisedDelegate(DateTime dt, ProcessException ex);
//[Serializable]
public class ProcessException : Exception
{
public ExceptionLevel Level { get; set; } = ExceptionLevel.Warning;
public ProcessException()
{
}
public ProcessException(Exception ex, ExceptionLevel lvl = ExceptionLevel.Warning) : base(ex.Message, ex)
{
Level = lvl;
ExceptionNotice();
}
public ProcessException(string error, Exception ex = null, ExceptionLevel lvl = ExceptionLevel.Warning) : base(error, ex)
{
Level = lvl;
ExceptionNotice();
}
public void ExceptionNotice()
{
//OnProcessExceptionRaised?.Invoke(DateTime.Now, this);
}
}
public static class ExceptionHelper
{
public static LogLevel LogLevel = LogLevel.Information;
public static string GetExceptionMessage(this Exception ex)
{
string msg = "异常信息:" + ex.Message;
if (ex.InnerException != null)
{
msg += "\t内部异常信息" + ex.InnerException.GetExceptionMessage();
}
if (LogLevel <= LogLevel.Assist)
{
msg += ("\r\n\t\tStackTrace:" + ex.StackTrace);
}
return msg;
}
}
public class AuthorityException : ProcessException
{
}
}

View File

@ -0,0 +1,162 @@
using DH.Commons.Enums;
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using static DH.Commons.Enums.EnumHelper;
namespace DH.Commons.Enums
{
/// <summary>
/// 设备特性,指示该信息的设备类型,适用于设备信息和配置信息
/// </summary>
public class DeviceAttribute : Attribute
{
/// <summary>
/// 设备类型
/// </summary>
public string TypeCode { get; set; }
public string TypeDescription { get; set; }
/// <summary>
/// 特性修饰类别
/// </summary>
public DeviceAttributeType AttrType { get; set; }
public DeviceAttribute(string typeCode, string typeDesc, EnumHelper.DeviceAttributeType attrType)
{
TypeCode = typeCode;
TypeDescription = typeDesc;
AttrType = attrType;
}
}
/// <summary>
/// 预置状态特性 指定该修饰信息的前置状态允许范围
/// </summary>
public class PreStateAttribute : Attribute
{
public int PreState { get; set; }
public PreStateAttribute(int _preState)
{
PreState = _preState;
}
/// <summary>
/// 检查当前待执行操作的前置状态要求是否合法
/// </summary>
/// <param name="currentState"></param>
/// <returns></returns>
public bool CheckPreStateValid(int currentState)
{
return (currentState & PreState) == currentState;
}
}
public class ColorSelectAttribute : Attribute
{
public string SelectedColor { get; set; }
public ColorSelectAttribute(string selectedColor)
{
SelectedColor = selectedColor;
}
}
public class FontColorSelectAttribute : Attribute
{
public string SelectedColor { get; set; }
public FontColorSelectAttribute(string selectedColor)
{
SelectedColor = selectedColor;
}
}
public enum InvokeType
{
/// <summary>
/// 不公开调用
/// </summary>
[Description("不公开调用")]
NoneInvoke = 0,
/// <summary>
/// 测试调用
/// </summary>
[Description("测试调用")]
TestInvoke = 1,
/// <summary>
/// 标定调用
/// </summary>
[Description("标定调用")]
CalibInvoke = 2,
}
/// <summary>
/// 用来修饰对外开放的调用方法的特性
/// 调用方法参数顺序IOperationConfigInvokeDeviceSourceDevice
/// </summary>
public class ProcessMethodAttribute : Attribute
{
public string MethodCode { get; set; }
public string MethodDesc { get; set; }
/// <summary>
/// 是否提供人工调用测试
/// </summary>
public InvokeType InvokeType { get; set; }
public string DeviceType { get; set; }
public ProcessMethodAttribute(string deviceType, string code, string description, InvokeType invokeType)
{
DeviceType = deviceType;
MethodCode = code;
MethodDesc = description;
InvokeType = invokeType;
}
}
public class SwitchDisplayAttribute : Attribute
{
public string SwitchName { get; set; }
public bool SwithOnStatus { get; set; } = true;
public SwitchDisplayAttribute(string name, bool status)
{
SwitchName = name;
SwithOnStatus = status;
}
}
public class ElementAttribute : Attribute
{
public string Name { get; set; }
public string Desc { get; set; }
public string IconPath { get; set; }
public bool IsShowInToolBar { get; set; }
public ElementAttribute(string desc, string iconPath, bool isShowInToolBar = true, [CallerMemberName] string name = "")
{
Name = name;
Desc = desc;
IconPath = iconPath;
IsShowInToolBar = isShowInToolBar;
}
}
public class ProcessAttribute : Attribute
{
public string ProcessCode { get; set; }
public DeviceAttributeType AttrType { get; set; }
public ProcessAttribute(string stationCode, DeviceAttributeType attrType)
{
ProcessCode = stationCode;
AttrType = attrType;
}
}
}

View File

@ -0,0 +1,272 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Text.Json;
using System.Text.Json.Serialization;
using AntdUI;
using DH.Commons.Base;
using DH.Commons.Models;
namespace DH.Commons.Helper
{
public static class ConfigHelper
{
private static readonly JsonSerializerOptions _jsonOptions = new JsonSerializerOptions
{
WriteIndented = true,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
IgnoreNullValues = true
};
/// <summary>
/// 配置存储根目录
/// </summary>
private static string ConfigsRoot => Path.Combine(
AppDomain.CurrentDomain.BaseDirectory,
"configs");
/// <summary>
/// 获取当前方案的主配置文件路径
/// </summary>
private static string CurrentConfigPath
{
get
{
ValidateCurrentScheme();
return Path.Combine(
ConfigsRoot,
$"config_{SystemModel.CurrentScheme}.json");
}
}
/// <summary>
/// 获取当前方案的备份目录路径
/// </summary>
private static string CurrentBackupDir
{
get
{
ValidateCurrentScheme();
return Path.Combine(
ConfigsRoot,
$"bak_{SystemModel.CurrentScheme}");
}
}
/// <summary>
/// 初始化新方案(创建空文件)
/// </summary>
public static void InitializeScheme(string scheme)
{
SystemModel.CurrentScheme = scheme;
// 创建空配置文件
if (!File.Exists(CurrentConfigPath))
{
Directory.CreateDirectory(ConfigsRoot);
File.WriteAllText(CurrentConfigPath, "{}");
}
// 创建备份目录
Directory.CreateDirectory(CurrentBackupDir);
}
/// <summary>
/// 保存当前配置(自动备份)
/// </summary>
public static void SaveConfig()
{
ValidateCurrentScheme();
// 确保配置目录存在
Directory.CreateDirectory(ConfigsRoot);
// 备份现有配置
if (File.Exists(CurrentConfigPath))
{
var backupName = $"config_{SystemModel.CurrentScheme}_{DateTime.Now:yyyyMMddHHmmss}.json";
var backupPath = Path.Combine(CurrentBackupDir, backupName);
Directory.CreateDirectory(CurrentBackupDir);
File.Copy(CurrentConfigPath, backupPath);
}
//重置标签文件路径和内容
ConfigModel.DetectionList.ForEach(config =>
{
GenerateLabelFile(config);
});
// 序列化当前配置
var json = JsonSerializer.Serialize(new
{
ConfigModel.CameraBaseList,
ConfigModel.PLCBaseList,
ConfigModel.DetectionList,
ConfigModel.GlobalList,
}, _jsonOptions);
// 写入新配置
File.WriteAllText(CurrentConfigPath, json);
}
private static void GenerateLabelFile(DetectionConfig config)
{
try
{
if (config.DetectionLableList == null || string.IsNullOrEmpty(config.In_lable_path))
return;
// 确保目录存在
var directory = Path.GetDirectoryName(config.In_lable_path);
if (!string.IsNullOrEmpty(directory) && !Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
// 写入文件内容
using (var writer = new StreamWriter(config.In_lable_path, false))
{
foreach (var label in config.DetectionLableList)
{
// 根据实际需求格式化输出
writer.WriteLine(label.LabelName.ToString()); // 假设DetectionLable重写了ToString()
// 或者明确指定格式:
// writer.WriteLine($"{label.Id},{label.Name},{label.Confidence}");
}
}
}
catch (Exception ex)
{
Debug.WriteLine($"生成标签文件失败: {ex.Message}");
// 可以考虑记录更详细的日志
}
}
/// <summary>
/// 加载当前方案配置
/// </summary>
public static void LoadConfig()
{
ValidateCurrentScheme();
if (!File.Exists(CurrentConfigPath))
{
InitializeScheme(SystemModel.CurrentScheme);
return;
}
var json = File.ReadAllText(CurrentConfigPath);
var data = JsonSerializer.Deserialize<ConfigData>(json, _jsonOptions);
ConfigModel.CameraBaseList = data?.Cameras ?? new List<CameraBase>();
ConfigModel.DetectionList = data?.Detections ?? new List<DetectionConfig>();
ConfigModel.PLCBaseList = data?.PLCs ?? new List<PLCBase>();
ConfigModel.GlobalList = data?.GlobalConfigs ?? new List<GlobalConfig>();
}
/// <summary>
/// 验证当前方案有效性
/// </summary>
private static void ValidateCurrentScheme()
{
if (string.IsNullOrWhiteSpace(SystemModel.CurrentScheme))
throw new InvalidOperationException("当前方案未设置");
}
/// <summary>
/// 派生新方案(基于当前方案创建副本)
/// </summary>
/// <param name="newSchemeName">新方案名称</param>
public static void DeriveScheme(string newSchemeName)
{
// 验证输入
if (string.IsNullOrWhiteSpace(newSchemeName))
{
throw new ArgumentException("新方案名称不能为空");
}
// 验证当前方案是否有效
ValidateCurrentScheme();
// 检查新方案是否已存在
var newConfigPath = Path.Combine(ConfigsRoot, $"config_{newSchemeName}.json");
if (File.Exists(newConfigPath))
{
throw new InvalidOperationException($"方案 {newSchemeName} 已存在");
}
// 保存当前配置确保最新
SaveConfig();
try
{
// 复制配置文件
File.Copy(CurrentConfigPath, newConfigPath);
// 创建备份目录
var newBackupDir = Path.Combine(ConfigsRoot, $"bak_{newSchemeName}");
Directory.CreateDirectory(newBackupDir);
// 可选:自动切换新方案
// SystemModel.CurrentScheme = newSchemeName;
}
catch (IOException ex)
{
throw new InvalidOperationException($"方案派生失败: {ex.Message}", ex);
}
}
/// <summary>
/// 删除指定方案的配置文件及备份目录
/// </summary>
/// <param name="schemeName">要删除的方案名称</param>
/// <exception cref="ArgumentException">当方案名称为空时抛出</exception>
/// <exception cref="IOException">文件操作失败时抛出</exception>
public static void DeleteSchemeConfig(string schemeName)
{
if (string.IsNullOrWhiteSpace(schemeName))
throw new ArgumentException("方案名称无效");
// 构造路径
var configPath = Path.Combine(ConfigsRoot, $"config_{schemeName}.json");
var backupDir = Path.Combine(ConfigsRoot, $"bak_{schemeName}");
try
{
// 删除配置文件
if (File.Exists(configPath))
{
File.Delete(configPath);
}
// 删除备份目录(递归删除)
if (Directory.Exists(backupDir))
{
Directory.Delete(backupDir, true);
}
}
catch (Exception ex) when (ex is IOException || ex is UnauthorizedAccessException)
{
throw new IOException($"删除方案 {schemeName} 的配置文件失败: {ex.Message}", ex);
}
}
/// <summary>
/// 配置数据模型(内部类)
/// </summary>
private class ConfigData
{
[JsonPropertyName("cameraBaseList")]
public List<CameraBase> Cameras { get; set; } = new List<CameraBase>();
[JsonPropertyName("plcBaseList")]
public List<PLCBase> PLCs { get; set; } = new List<PLCBase>();
[JsonPropertyName("detectionList")]
public List<DetectionConfig> Detections { get; set; } = new List<DetectionConfig>();
[JsonPropertyName("globalList")]
public List<GlobalConfig> GlobalConfigs { get; set; } = new List<GlobalConfig>();
}
}
}

View File

@ -76,159 +76,83 @@ namespace DH.Commons.Enums
} }
} }
//public static System.Windows.Media.Color GetEnumSelectedMediaColor(this Enum enumObj) // 根据描述获取枚举值(泛型方法)
//{ public static T GetEnumFromDescription<T>(string description) where T : Enum
// Type t = enumObj.GetType(); {
// FieldInfo f = t.GetField(enumObj.ToString()); Type enumType = typeof(T);
foreach (T value in Enum.GetValues(enumType))
// ColorSelectAttribute attr = f.GetCustomAttribute<ColorSelectAttribute>(); {
// if (attr != null) string desc = GetEnumDescription(value);
// { if (desc == description)
// var prop = typeof(System.Windows.Media.Colors).GetProperties().FirstOrDefault(p => p.Name == attr.SelectedColor); {
// if (prop != null) return value;
// { }
// return (System.Windows.Media.Color)prop.GetValue(null); }
// } throw new ArgumentException($"在枚举 {enumType.Name} 中未找到描述为 '{description}' 的值");
// } }
// return System.Windows.Media.Colors.Transparent;
//}
//public static System.Drawing.Color GetEnumSelectedColor(this Enum enumObj)
//{
// Type t = enumObj.GetType();
// FieldInfo f = t.GetField(enumObj.ToString());
// ColorSelectAttribute attr = f.GetCustomAttribute<ColorSelectAttribute>();
// if (attr != null)
// {
// return System.Drawing.Color.FromName(attr.SelectedColor);
// }
// else
// {
// return System.Drawing.Color.Transparent;
// }
//}
//public static System.Drawing.Color GetEnumSelectedFontColor(this Enum enumObj)
//{
// Type t = enumObj.GetType();
// FieldInfo f = t.GetField(enumObj.ToString());
// var attr = f.GetCustomAttribute<FontColorSelectAttribute>();
// if (attr != null)
// {
// return System.Drawing.Color.FromName(attr.SelectedColor);
// }
// else
// {
// return System.Drawing.Color.Transparent;
// }
//}
//public static string GetEnumSelectedColorString(this Enum enumObj)
//{
// Type t = enumObj.GetType();
// FieldInfo f = t.GetField(enumObj.ToString());
// ColorSelectAttribute attr = f.GetCustomAttribute<ColorSelectAttribute>();
// if (attr != null)
// {
// return attr.SelectedColor;
// }
// else
// {
// return "Transparent";
// }
//}
/// <summary> /// <summary>
/// 当枚举牵涉到状态变换,检查现状态是否满足待转换的状态的前置状态要求 /// 获取枚举类型的所有描述文本
/// </summary> /// </summary>
/// <param name="stateToBe"></param> /// <param name="enumType">枚举类型</param>
/// <param name="currentState"></param> /// <returns>描述文本列表</returns>
/// <returns></returns> public static List<string> GetEnumDescriptions(Type enumType)
//public static bool CheckPreStateValid(this Enum stateToBe, int currentState) {
//{ // 验证类型是否为枚举
// Type t = stateToBe.GetType(); if (!enumType.IsEnum)
// FieldInfo f = t.GetField(stateToBe.ToString()); throw new ArgumentException("传入的类型必须是枚举类型", nameof(enumType));
// PreStateAttribute attr = f.GetCustomAttribute<PreStateAttribute>(); var descriptions = new List<string>();
// if (attr == null)
// {
// return true;
// }
// else
// {
// return attr.CheckPreStateValid(currentState);
// }
//}
/// <summary> foreach (var value in Enum.GetValues(enumType))
/// 设备状态定义 {
/// 未初始化和异常状态无前置状态要求 var fieldInfo = enumType.GetField(value.ToString());
/// 初始化操作前置状态必须是未初始化、关闭状态和异常状态 var attribute = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
/// 打开前置必须是初始化和暂停 descriptions.Add(attribute?.Description ?? value.ToString());
/// 关闭前置必须是打开和暂停和异常 }
/// 暂停前置必须是打开
/// </summary>
//public enum DeviceState
//{
// TBD = -1,
// [ColorSelect("Gray")] return descriptions;
// [FontColorSelect("Black")] }
// [Description("未初始化")] public static string GetEnumDescription1(Enum value)
// DSUninit = 1, {
var field = value.GetType().GetField(value.ToString());
var attribute = field.GetCustomAttributes(typeof(DescriptionAttribute), false)
.FirstOrDefault() as DescriptionAttribute;
return attribute?.Description ?? value.ToString();
}
// [ColorSelect("Gold")] public static System.Drawing.Color GetEnumSelectedColor(this Enum enumObj)
// [FontColorSelect("White")] {
// [PreState(1 + 2 + 4 + 8 + 32)] Type t = enumObj.GetType();
// [Description("初始化")] FieldInfo f = t.GetField(enumObj.ToString());
// DSInit = 2,
// [ColorSelect("Lime")] ColorSelectAttribute attr = f.GetCustomAttribute<ColorSelectAttribute>();
// [FontColorSelect("Black")] if (attr != null)
// [PreState(2 + 4 + 16)] {
// [Description("运行中")] return System.Drawing.Color.FromName(attr.SelectedColor);
// DSOpen = 4, }
else
{
return System.Drawing.Color.Transparent;
}
}
// [ColorSelect("Gray")] public static System.Drawing.Color GetEnumSelectedFontColor(this Enum enumObj)
// [FontColorSelect("White")] {
// [PreState(1 + 4 + 8 + 16 + 32)] Type t = enumObj.GetType();
// [Description("关闭")] FieldInfo f = t.GetField(enumObj.ToString());
// DSClose = 8,
// [ColorSelect("Gold")] var attr = f.GetCustomAttribute<FontColorSelectAttribute>();
// [FontColorSelect("White")] if (attr != null)
// [PreState(4 + 16)] {
// [Description("暂停")] return System.Drawing.Color.FromName(attr.SelectedColor);
// DSPause = 16, }
else
{
return System.Drawing.Color.Transparent;
}
}
// [ColorSelect("Red")]
// [FontColorSelect("White")]
// [Description("异常")]
// DSExcept = 32
//}
///// <summary>
///// 工序状态
///// </summary>
//public enum RunState
//{
// [ColorSelect("Gold")]
// [Description("空闲")]
// Idle = 1,
// [ColorSelect("Lime")]
// [Description("运行中")]
// Running = 2,
// [ColorSelect("Gray")]
// [Description("停止")]
// Stop = 3,
// [ColorSelect("Red")]
// [Description("宕机")]
// Down = 99,
//}
[Flags] [Flags]
public enum DeviceAttributeType public enum DeviceAttributeType
@ -362,6 +286,37 @@ namespace DH.Commons.Enums
MeasureResult = 31, MeasureResult = 31,
} }
public enum LogLevel
{
[Description("详细")]
[ColorSelect("White")]
[FontColorSelect("Green")]
Detail = 2,
[Description("信息")]
[ColorSelect("White")]
[FontColorSelect("Dark")]
Information = 3,
[Description("辅助")]
[ColorSelect("White")]
[FontColorSelect("Blue")]
Assist = 4,
[Description("动作")]
[ColorSelect("DarkGreen")]
[FontColorSelect("Yellow")]
Action = 5,
[Description("错误")]
[ColorSelect("Orange")]
[FontColorSelect("White")]
Error = 6,
[Description("警报")]
[ColorSelect("Brown")]
[FontColorSelect("White")]
Warning = 7,
[Description("异常")]
[ColorSelect("Red")]
[FontColorSelect("White")]
Exception = 8,
}
//public enum CameraDriverType //public enum CameraDriverType
//{ //{
// Halcon, // Halcon,
@ -382,7 +337,44 @@ namespace DH.Commons.Enums
// NG = -1, // NG = -1,
// IGNORE = -999, // IGNORE = -999,
//} //}
public enum DeviceState
{
TBD = -1,
[ColorSelect("Gray")]
[FontColorSelect("Black")]
[Description("未初始化")]
DSUninit = 1,
[ColorSelect("Gold")]
[FontColorSelect("White")]
[PreState(1 + 2 + 4 + 8 + 32)]
[Description("初始化")]
DSInit = 2,
[ColorSelect("Lime")]
[FontColorSelect("Black")]
[PreState(2 + 4 + 16)]
[Description("运行中")]
DSOpen = 4,
[ColorSelect("Gray")]
[FontColorSelect("White")]
[PreState(1 + 4 + 8 + 16 + 32)]
[Description("关闭")]
DSClose = 8,
[ColorSelect("Gold")]
[FontColorSelect("White")]
[PreState(4 + 16)]
[Description("暂停")]
DSPause = 16,
[ColorSelect("Red")]
[FontColorSelect("White")]
[Description("异常")]
DSExcept = 32
}
public enum PriorityDirection public enum PriorityDirection
{ {
X, X,
@ -674,31 +666,31 @@ namespace DH.Commons.Enums
Warning = 8, Warning = 8,
} }
//public enum ResultState public enum ResultState
//{ {
// [Description("NA")] [Description("NA")]
// NA = -5, NA = -5,
// [Description("尺寸NG")] [Description("尺寸NG")]
// SizeNG = -4, SizeNG = -4,
// [Description("检测NG")] [Description("检测NG")]
// DetectNG = -3, DetectNG = -3,
// //[Description("检测不足TBD")] //[Description("检测不足TBD")]
// // ShortageTBD = -2, // ShortageTBD = -2,
// [Description("检测结果TBD")] [Description("检测结果TBD")]
// ResultTBD = -1, ResultTBD = -1,
// [Description("OK")] [Description("OK")]
// OK = 1, OK = 1,
// // [Description("NG")] // [Description("NG")]
// // NG = 2, // NG = 2,
// //统计结果 //统计结果
// [Description("A类NG")] [Description("A类NG")]
// A_NG = 25, A_NG = 25,
// [Description("B类NG")] [Description("B类NG")]
// B_NG = 26, B_NG = 26,
// [Description("C类NG")] [Description("C类NG")]
// C_NG = 27, C_NG = 27,
//} }
public enum HikCameraType public enum HikCameraType
{ {
[Description("HikCamera-Gige")] [Description("HikCamera-Gige")]

View File

@ -0,0 +1,107 @@

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using DH.Commons.Helper;
namespace DH.Commons.Enums
{
public class ImageSaveHelper
{
public event Action<DateTime, string> OnImageSaveExceptionRaised;
//private string baseDirectory = "";
//public string BaseDirectory
//{
// get => baseDirectory;
// set
// {
// baseDirectory = value;
// if (string.IsNullOrWhiteSpace(baseDirectory) || !Path.IsPathRooted(baseDirectory))
// {
// baseDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Images");
// }
// }
//}
public bool EnableImageSave { get; set; } = true;
public ImageSaveHelper() { }
public ImageSaveHelper(bool enableImageSave = true)
{
EnableImageSave = enableImageSave;
}
object lockObj = new object();
////耗时操作从 _taskFactory分配线程
//public TaskFactory _taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.LongRunning);
readonly ConcurrentQueue<ImageSaveSet> _imageQueue = new ConcurrentQueue<ImageSaveSet>();
Task _saveTask = null;
readonly object _saveLock = new object();
public async void ImageSaveAsync(ImageSaveSet set)
{
if (!EnableImageSave)
return;
await Task.Run(() =>
{
_imageQueue.Enqueue(set);
lock (_saveLock)
{
if (_saveTask == null)
{
_saveTask = Task.Run(async () =>
{
try
{
while (true)
{
while (_imageQueue.Count > 0)
{
if (_imageQueue.TryDequeue(out ImageSaveSet saveSet))
{
if (!Directory.Exists(Path.GetDirectoryName(saveSet.FullName)))
{
Directory.CreateDirectory(Path.GetDirectoryName(saveSet.FullName));
}
if (saveSet.SaveImage != null)
{
saveSet.SaveImage.Save(saveSet.FullName, saveSet.ImageFormat);
saveSet.SaveImage.Dispose();
}
saveSet = null;
}
}
await Task.Delay(2000);
}
}
catch (Exception ex)
{
OnImageSaveExceptionRaised?.Invoke(DateTime.Now, $"图片保存异常:{ex.GetExceptionMessage()}");
}
});
}
}
});
}
}
public class ImageSaveSet
{
public string FullName { get; set; }//带后缀 全路径
public Bitmap SaveImage { get; set; }
public ImageFormat ImageFormat { get; set; } = ImageFormat.Jpeg;
}
}

View File

@ -0,0 +1,138 @@
using DH.Commons.Helper;
using System;
using System.Collections.Concurrent;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using static DH.Commons.Enums.EnumHelper;
namespace DH.Commons.Enums
{
public interface ILogOutput
{
event Action<LogMsg> OnLogMsgOutput;
void LogDisplay(LogMsg msg);
}
public interface ILogger
{
event Action<LogMsg> OnLog;
LoggerHelper LoggerHelper { get; set; }
//void LogAsync(DateTime dt, LogLevel loglevel, string msg);
void LogAsync(LogMsg msg);
}
public class LoggerHelper
{
public event Action<DateTime, string> OnLogExceptionRaised;
public string LogPath { get; set; }
public string LogPrefix { get; set; }
LogLevel LogLevel = LogLevel.Information;
public LoggerHelper() { }
public LoggerHelper(string logPath, string logPrefix, LogLevel logLevel = LogLevel.Information)
{
LogPath = logPath;
LogPrefix = logPrefix;
LogLevel = logLevel;
}
public void SetLogLevel(LogLevel logLevel)
{
if (LogLevel != logLevel)
LogLevel = logLevel;
}
////耗时操作从 _taskFactory分配线程
//public TaskFactory _taskFactory = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.LongRunning);
readonly ConcurrentQueue<LogMsg> _logQueue = new ConcurrentQueue<LogMsg>();
Task _logTask = null;
readonly object _logLock = new object();
public async void LogAsync(LogMsg msg)
{
await Task.Run(() =>
{
_logQueue.Enqueue(msg);
lock (_logLock)
{
if (_logTask == null)
{
_logTask = Task.Run(async () =>
{
string filePath = Path.Combine(LogPath, $"{(string.IsNullOrWhiteSpace(LogPrefix) ? "Log_" : ("Log_" + LogPrefix + "_"))}{DateTime.Now.ToString("yyyyMMdd")}.txt");
try
{
if (!StaticHelper.CheckFilesCanUse(filePath))
{
OnLogExceptionRaised?.Invoke(DateTime.Now, $"日志文件{filePath}被占用,无法写入");
return;
}
using (StreamWriter writer = new StreamWriter(filePath, true, System.Text.Encoding.UTF8))
{
while (true)
{
if (!Directory.Exists(LogPath))
{
Directory.CreateDirectory(LogPath);
}
while (_logQueue.Count > 0)
{
if (_logQueue.TryDequeue(out LogMsg log))
{
if (log.LogLevel >= LogLevel)
{
writer.WriteLine($"{log.LogTime.ToString("yyyy-MM-dd HH:mm:ss.fff")}[{log.ThreadId}]\t{log.LogLevel.GetEnumDescription()}\t{log.Msg}");
}
}
}
writer.Flush();
await Task.Delay(2000);
}
}
}
catch (Exception ex)
{
//OnLogExceptionRaised?.Invoke(DateTime.Now, $"日志文件{filePath}写入异常:/*{ex.GetExceptionMessage()*/}");
OnLogExceptionRaised?.Invoke(DateTime.Now, $"日志文件{filePath}写入异常");
}
});
}
}
});
}
public void LogAsync(DateTime dt, LogLevel logLevel, string msg)
{
LogAsync(new LogMsg(dt, logLevel, msg));
}
}
public class LogMsg
{
public DateTime LogTime { get; set; }
public LogLevel LogLevel { get; set; }
//public string Prefix { get; set; }
public string Msg { get; set; }
public string MsgSource { get; set; }
public int ThreadId { get; set; }
public LogMsg() { }
public LogMsg(DateTime dt, LogLevel logLevel, string msg)
{
LogTime = dt;
LogLevel = logLevel;
Msg = msg;
}
public override string ToString()
{
return $"{LogTime.ToString("HH:mm:ss.fff")}\t{MsgSource}\t{Msg}";
}
}
}

View File

@ -571,8 +571,8 @@ namespace DH.Commons.Enums
} }
//分别基于像素GetPixel和SetPixel、基于内存、基于指针这三种方法增强图片对比度 //分别基于像素GetPixel和SetPixel、基于内存、基于指针这三种方法增强图片对比度
// 第一种方法:像素提取法 速度慢 基于像素400-600ms // 第一种方法:像素提取法速度慢 基于像素400-600ms
public static Bitmap MethodBaseOnPixel(Bitmap bitmap, int degree) public static Bitmap MethodBaseOnPixel(Bitmap bitmap, int degree)
{ {
Color curColor; Color curColor;

View File

@ -0,0 +1,117 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.Commons.Helper
{
public static class SchemeHelper
{
private const string SchemesKey = "Schemes";
private const string CurrentSchemeKey = "CurrentScheme";
private const char Separator = '|';
/// <summary>
/// 初始化配置(首次运行时调用)
/// </summary>
public static void Initialize()
{
// 如果Schemes不存在创建空键
if (!SystemConfigHelper.KeyExists(SchemesKey))
{
SystemConfigHelper.SetValue(SchemesKey, "");
}
// 如果CurrentScheme不存在创建空键
if (!SystemConfigHelper.KeyExists(CurrentSchemeKey))
{
SystemConfigHelper.SetValue(CurrentSchemeKey, "");
}
}
/// <summary>
/// 获取所有方案(自动处理空值)
/// </summary>
public static List<string> GetAllSchemes()
{
var schemeString = SystemConfigHelper.GetValue(SchemesKey, "");
return string.IsNullOrEmpty(schemeString)
? new List<string>()
: new List<string>(schemeString.Split(Separator));
}
/// <summary>
/// 添加新方案(自动初始化处理)
/// </summary>
public static void AddScheme(string schemeName)
{
if (string.IsNullOrWhiteSpace(schemeName))
throw new ArgumentException("方案名称无效");
var schemes = GetAllSchemes();
if (schemes.Contains(schemeName))
throw new InvalidOperationException($"方案 {schemeName} 已存在");
schemes.Add(schemeName);
SaveSchemes(schemes);
}
/// <summary>
/// 设置当前方案(空值安全处理)
/// </summary>
public static void SetCurrentScheme(string schemeName)
{
var schemes = GetAllSchemes();
if (!schemes.Contains(schemeName))
throw new KeyNotFoundException($"方案 {schemeName} 不存在");
SystemConfigHelper.SetValue(CurrentSchemeKey, schemeName);
}
/// <summary>
/// 获取当前方案(默认值处理)
/// </summary>
public static string GetCurrentScheme()
{
var current = SystemConfigHelper.GetValue(CurrentSchemeKey, "");
return !string.IsNullOrEmpty(current) ? current : "默认方案";
}
private static void SaveSchemes(List<string> schemes)
{
var schemeString = schemes.Count > 0
? string.Join(Separator.ToString(), schemes)
: "";
SystemConfigHelper.SetValue(SchemesKey, schemeString);
}
/// <summary>
/// 删除指定方案(自动同步当前方案状态)
/// </summary>
/// <param name="schemeName">要删除的方案名称</param>
/// <exception cref="ArgumentException">当方案名称为空时抛出</exception>
/// <exception cref="KeyNotFoundException">当方案不存在时抛出</exception>
public static void DeleteScheme(string schemeName)
{
if (string.IsNullOrWhiteSpace(schemeName))
throw new ArgumentException("方案名称无效");
var schemes = GetAllSchemes();
if (!schemes.Contains(schemeName))
throw new KeyNotFoundException($"方案 {schemeName} 不存在");
// 删除前检查是否是当前方案
bool isCurrent = GetCurrentScheme() == schemeName;
// 执行删除操作
schemes.Remove(schemeName);
SaveSchemes(schemes);
}
}
}

View File

@ -0,0 +1,680 @@
using Microsoft.CSharp.RuntimeBinder;
using Newtonsoft.Json;
using System.Collections.ObjectModel;
using System.Drawing.Imaging;
using System.Dynamic;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.ExceptionServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;
namespace DH.Commons.Helper
{
public static class StaticHelper
{
/// <summary>
/// 数值转换为byte数组 高位在前,低位在后
/// </summary>
/// <param name="number"></param>
/// <param name="size"></param>
/// <returns></returns>
public static byte[] IntToBytes(this int number, int size = 2)
{
byte[] result = new byte[size];
int temp = size;
while (temp > 0)
{
result[size - temp] = (byte)(number >> ((temp - 1) * 8) & 0xff);
temp--;
}
return result;
}
public static T DeepSerializeClone<T>(this T t)
{
return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(t));
}
/// <summary>
/// 字节数组转换为整数
/// </summary>
/// <param name="data">字节数组</param>
/// <param name="HtL">true:数组序号低的在高位 false数组序号低的在低位</param>
/// <returns></returns>
public static int BytesToInt(this byte[] data, bool HtL = true)
{
int res = 0;
for (int i = 0; i < data.Length; i++)
{
int index = i;
if (HtL)
{
index = data.Length - 1 - i;
}
res += data[index] << (8 * i);
}
return res;
}
/// <summary>
/// 获取一个类指定的属性值
/// </summary>
/// <param name="info">object对象</param>
/// <param name="field">属性名称</param>
/// <returns></returns>
public static object GetPropertyValue(object info, string field)
{
if (info == null) return null;
Type t = info.GetType();
IEnumerable<System.Reflection.PropertyInfo> property = from pi in t.GetProperties() where pi.Name.ToLower() == field.ToLower() select pi;
return property.First().GetValue(info, null);
}
/// <summary>
/// 将32位整形拆分为无符号16位整形
/// </summary>
/// <param name="num">需要拆分的32位整形</param>
/// <param name="bitNum">拆分为16位整形的位数 1或者2</param>
/// <param name="HtL">true高位在前低位在后false高位在后低位在前</param>
/// <returns></returns>
public static List<ushort> ParseIntToUnsignShortList(this int num, int bitNum = 2, bool HtL = false)
{
if (bitNum == 2)
{
ushort high = (ushort)(num >> 16);
ushort low = (ushort)num;
if (HtL)
{
return new List<ushort>() { high, low };
}
else
{
return new List<ushort>() { low, high };
}
}
else
{
if (num < 0)
{
num = ushort.MaxValue + 1 + num;
}
return new List<ushort>() { (ushort)num };
}
}
/// <summary>
/// 将32位整形数组拆分为无符号16位整形数组
/// </summary>
/// <param name="list">需要拆分的32位整形</param>
/// <param name="bitNum">拆分为16位整形的位数 1或者2</param>
/// <param name="HtL">true高位在前低位在后false高位在后低位在前</param>
/// <returns></returns>
public static List<ushort> ParseIntToUnsignShortList(this List<int> list, int bitNum = 2, bool HtL = false)
{
return list.SelectMany(u => u.ParseIntToUnsignShortList(bitNum, HtL)).ToList();
}
/// <summary>
/// 将ushort的集合转换为16位带符号整形
/// </summary>
/// <param name="numList"></param>
/// <param name="bitNum">合并的位数 1或者2</param>
/// <param name="HtL">true高位在前低位在后false高位在后低位在前</param>
/// <returns></returns>
public static List<int> ParseUnsignShortListToInt(this List<int> numList, int bitNum = 2, bool HtL = false)
{
if (bitNum == 1)
{
return numList.ConvertAll(n =>
{
int num = n;
if (num > short.MaxValue)
{
num = num - ushort.MaxValue - 1;
}
return num;
});
}
else
{
List<int> list = new List<int>();
for (int i = 0; i < numList.Count; i += 2)
{
int high = HtL ? numList[i] : numList[i + 1];
int low = HtL ? numList[i + 1] : numList[i];
list.Add((high << 16) | low);
}
return list;
}
}
//public static T DeepSerializeClone<T>(this T t)
//{
// return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(t));
//}
public static void DataFrom<T1, T2>(this T1 destT, T2 sourceT, List<string> exceptionProps = null) where T1 : class where T2 : class
{
if (sourceT == null)
{
destT = null;
return;
}
PropertyInfo[] propDest = destT.GetType().GetProperties();//.Where(p => !(p.GetMethod.IsVirtual && !p.GetMethod.IsFinal)).ToArray();
PropertyInfo[] propSource = sourceT.GetType().GetProperties();
Array.ForEach(propDest, prop =>
{
if (exceptionProps == null || !exceptionProps.Contains(prop.Name))
{
if (prop.CanWrite)
{
PropertyInfo propS = propSource.FirstOrDefault(p => p.Name == prop.Name);
if (propS != null && propS.CanRead)
{
prop.SetValue(destT, propS.GetValue(sourceT));
}
}
}
});
}
//RtlMoveMemory
[DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory", SetLastError = false)]
public static extern void CopyMemory(IntPtr dest, IntPtr src, uint count);
[HandleProcessCorruptedStateExceptions]
//public static Bitmap CopyBitmap(this Bitmap source)
//{
// Bitmap clone = new Bitmap(source.Width, source.Height, source.PixelFormat);
// try
// {
// int PixelSize = Bitmap.GetPixelFormatSize(source.PixelFormat) / 8;
// if (PixelSize == 1)
// {
// ColorPalette cp = clone.Palette;
// for (int i = 0; i < 256; i++)
// {
// cp.Entries[i] = Color.FromArgb(255, i, i, i);
// }
// clone.Palette = cp;
// }
// Rectangle rect = new Rectangle(0, 0, source.Width, source.Height);
// BitmapData sourceData = source.LockBits(rect, ImageLockMode.ReadWrite, source.PixelFormat);
// BitmapData cloneData = clone.LockBits(rect, ImageLockMode.ReadWrite, source.PixelFormat);
// if (source.Width % 4 == 0)
// {
// unsafe
// {
// CopyMemory(cloneData.Scan0, sourceData.Scan0, (uint)(sourceData.Stride * sourceData.Height));
// }
// }
// else
// {
// Parallel.For(0, source.Height, h =>
// {
// unsafe
// {
// CopyMemory(cloneData.Scan0 + h * sourceData.Stride, sourceData.Scan0 + h * sourceData.Stride, (uint)sourceData.Width);
// }
// });
// }
// clone.UnlockBits(cloneData);
// source.UnlockBits(sourceData);
// }
// catch (Exception ex)
// {
// return clone;
// }
// return clone;
//}
public static Bitmap CopyBitmap(this Bitmap source)
{
Bitmap clone = new Bitmap(source.Width, source.Height, source.PixelFormat);
try
{
int pixelSize = Bitmap.GetPixelFormatSize(source.PixelFormat) / 8;
if (pixelSize == 1)
{
ColorPalette cp = clone.Palette;
for (int i = 0; i < 256; i++)
{
cp.Entries[i] = Color.FromArgb(255, i, i, i);
}
clone.Palette = cp;
}
Rectangle rect = new Rectangle(0, 0, source.Width, source.Height);
BitmapData sourceData = source.LockBits(rect, ImageLockMode.ReadOnly, source.PixelFormat);
BitmapData cloneData = clone.LockBits(rect, ImageLockMode.WriteOnly, source.PixelFormat);
int stride = sourceData.Stride;
int height = sourceData.Height;
if (stride % 4 == 0)
{
unsafe
{
CopyMemory(cloneData.Scan0, sourceData.Scan0, (uint)(stride * height));
}
}
else
{
Parallel.For(0, height, h =>
{
unsafe
{
CopyMemory(cloneData.Scan0 + h * stride, sourceData.Scan0 + h * stride, (uint)stride);
}
});
}
source.UnlockBits(sourceData); clone.UnlockBits(cloneData);
}
catch (Exception ex)
{ // Handle or log exception if needed
} return clone; }
public static Bitmap BitmapDeepClone(Bitmap source)
{
Bitmap clone = new Bitmap(source.Width, source.Height, source.PixelFormat);
try
{
int PixelSize = Bitmap.GetPixelFormatSize(source.PixelFormat) / 8;
if (PixelSize == 1)
{
ColorPalette cp = clone.Palette;
for (int i = 0; i < 256; i++)
{
cp.Entries[i] = Color.FromArgb(255, i, i, i);
}
clone.Palette = cp;
}
Rectangle rect = new Rectangle(0, 0, source.Width, source.Height);
BitmapData source_bitmap = source.LockBits(rect, ImageLockMode.ReadWrite, source.PixelFormat);
BitmapData destination_bitmap = clone.LockBits(rect, ImageLockMode.ReadWrite, clone.PixelFormat);
int depth_width = source_bitmap.Width * PixelSize;
unsafe
{
byte* source_ptr = (byte*)source_bitmap.Scan0;
byte* destination_ptr = (byte*)destination_bitmap.Scan0;
int offset = source_bitmap.Stride - depth_width;
for (int i = 0; i < source_bitmap.Height; i++)
{
for (int j = 0; j < depth_width; j++, source_ptr++, destination_ptr++)
{
*destination_ptr = *source_ptr;
}
source_ptr += offset;
destination_ptr += offset;
}
}
source.UnlockBits(source_bitmap);
clone.UnlockBits(destination_bitmap);
}
catch (Exception ex)
{
}
return clone;
}
public static Bitmap HConnectBitmap(this Bitmap map1, Bitmap map2)
{
Bitmap connectImage = null;
if (map1 == null || map2 == null)
return null;
//横向拼接
int width = map1.Width + map2.Width;
//高度不变
int height = Math.Max(map1.Height, map2.Height);
connectImage = new Bitmap(width, height);
using (Graphics graph = Graphics.FromImage(connectImage))
{
graph.DrawImage(connectImage, width, height);
graph.Clear(System.Drawing.Color.White);
graph.DrawImage(map1, 0, 0);
graph.DrawImage(map2, map1.Width, 0);
}
return connectImage;
}
public static IntPtr FloatToIntptr(float[] bytes)
{
GCHandle hObject = GCHandle.Alloc(bytes, GCHandleType.Pinned);
return hObject.AddrOfPinnedObject();
}
// 将Btimap类转换为byte[]类函数
public static byte[] GetBGRValues(Bitmap bmp, out int stride)
{
var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
var bmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, bmp.PixelFormat);
stride = bmpData.Stride;
var rowBytes = bmpData.Width * Image.GetPixelFormatSize(bmp.PixelFormat) / 8;
var imgBytes = bmp.Height * rowBytes;
byte[] rgbValues = new byte[imgBytes];
IntPtr ptr = bmpData.Scan0;
for (var i = 0; i < bmp.Height; i++)
{
Marshal.Copy(ptr, rgbValues, i * rowBytes, rowBytes);
ptr += bmpData.Stride;
}
bmp.UnlockBits(bmpData);
return rgbValues;
}
/// <summary>
/// 缺陷灰度图转彩色图像函数
/// </summary>
/// <param name="src">灰度图</param>
/// <returns>返回构造的伪彩色图像</returns>
public static Bitmap GrayMapToColorMap(this Bitmap src, Dictionary<int, Color> indexColorDict = null)
{
try
{
//Stopwatch sw = new Stopwatch();
//sw.Start();
Bitmap dest = new Bitmap(src.Width, src.Height, PixelFormat.Format32bppArgb);
int destHeight = dest.Height;
int destWidth = dest.Width;
Rectangle rect = new Rectangle(0, 0, destWidth, destHeight);
BitmapData bmpDataDest = dest.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
BitmapData bmpDataSrc = src.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format8bppIndexed);
int strideDest = bmpDataDest.Stride;
int strideSrc = bmpDataSrc.Stride;
unsafe
{
byte* pDest = (byte*)bmpDataDest.Scan0.ToPointer();
byte* pSrc = (byte*)bmpDataSrc.Scan0.ToPointer();
Parallel.For(0, destHeight, y =>
{
Parallel.For(0, destWidth, x =>
{
int pixel = pSrc[y * strideSrc + x];
int startIndex = y * strideDest + x * 4;
if (pixel >= 0 && pixel <= 63)
{
Color color = Color.Red;
if (indexColorDict != null && indexColorDict.ContainsKey(pixel))
{
color = indexColorDict[pixel];
}
byte R = color.R;
byte G = color.G;
byte B = color.B;
pDest[startIndex] = B;
pDest[startIndex + 1] = G;
pDest[startIndex + 2] = R;
pDest[startIndex + 3] = 100;
}
else
{
pDest[startIndex] = 255;
pDest[startIndex + 1] = 255;
pDest[startIndex + 2] = 255;
pDest[startIndex + 3] = 0;
}
});
});
}
dest.UnlockBits(bmpDataDest);
src.UnlockBits(bmpDataSrc);
//sw.Stop();
//Console.WriteLine($"转换耗时:{sw.ElapsedMilliseconds}");
return dest;
}
catch (Exception ex)
{
return null;
}
}
public static void Sort<T>(this ObservableCollection<T> collection) where T : IComparable<T>
{
List<T> sortedList = collection.OrderByDescending(x => x).ToList();//这里用降序
for (int i = 0; i < sortedList.Count(); i++)
{
collection.Move(collection.IndexOf(sortedList[i]), i);
}
}
/// <summary>
/// 获得字符串中开始和结束字符串中间的值
/// </summary>
/// <param name="sourse"></param>
/// <param name="startstr"></param>
/// <param name="endstr"></param>
/// <returns></returns>
public static string GetMidString(string sourse, string startstr, string endstr)
{
string result = string.Empty;
int startindex, endindex;
try
{
startindex = sourse.IndexOf(startstr);
if (startindex == -1)
return result;
string tmpstr = sourse.Substring(startindex + startstr.Length);
endindex = tmpstr.IndexOf(endstr);
if (endindex == -1)
return result;
result = tmpstr.Remove(endindex);
}
catch (Exception ex)
{
return "";
}
return result;
}
/// <summary>
/// 获得字符串中开始和结束字符串中间的值
/// </summary>
/// <param name="t">字符串</param>
/// <param name="k">开始</param>
/// <param name="j">结束</param>
/// <returns></returns>
private static string GetMidString2(string sourse, string startstr, string endstr) //截取指定文本,和易语言的取文本中间差不多
{
try //异常捕捉
{
var kn = sourse.IndexOf(startstr, StringComparison.Ordinal) + startstr.Length;
var jn = sourse.IndexOf(endstr, kn, StringComparison.Ordinal);
return sourse.Substring(kn, jn - kn);
}
catch //如果发现未知的错误,比如上面的代码出错了,就执行下面这句代码
{
return ""; //返回空
}
}
// 布尔类型转换为整型
public static int ToInt(this object obj)
{
if (Convert.ToBoolean(obj) == true)
return 1;
else
return 0;
}
// 整型转换为布尔类型
public static bool ToBool(this object obj)
{
if (Convert.ToInt32(obj) == 1)
return true;
else
return false;
}
public static object GetProperty(this object o, string member)
{
if (o == null) throw new ArgumentNullException("o");
if (member == null) throw new ArgumentNullException("member");
Type scope = o.GetType();
IDynamicMetaObjectProvider provider = o as IDynamicMetaObjectProvider;
if (provider != null)
{
ParameterExpression param = Expression.Parameter(typeof(object));
DynamicMetaObject mobj = provider.GetMetaObject(param);
GetMemberBinder binder = (GetMemberBinder)Microsoft.CSharp.RuntimeBinder.Binder.GetMember(0, member, scope, new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(0, null) });
DynamicMetaObject ret = mobj.BindGetMember(binder);
BlockExpression final = Expression.Block(
Expression.Label(CallSiteBinder.UpdateLabel),
ret.Expression
);
LambdaExpression lambda = Expression.Lambda(final, param);
Delegate del = lambda.Compile();
return del.DynamicInvoke(o);
}
else
{
return o.GetType().GetProperty(member, BindingFlags.Public | BindingFlags.Instance).GetValue(o, null);
}
}
#region
[DllImport("kernel32.dll")]
private static extern IntPtr _lopen(string lpPathName, int iReadWrite);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(IntPtr hObject);
private const int OF_READWRITE = 2;
private const int OF_SHARE_DENY_NONE = 0x40;
private static readonly IntPtr HFILE_ERROR = new IntPtr(-1);
/// <summary>
/// 检测文件是否只读或被使用
/// </summary>
/// <param name="FileNames">要检测的文件</param>
/// <returns>true可用false在用或只读</returns>
public static bool CheckFilesCanUse(string fileName)
{
if (!File.Exists(fileName))
return true;//文件不存在
if ((File.GetAttributes(fileName) & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
return false; //文件只读
IntPtr vHandle = _lopen(fileName, OF_READWRITE | OF_SHARE_DENY_NONE);
if (vHandle == HFILE_ERROR)
{
CloseHandle(vHandle);
return false; //文件被占用
}
CloseHandle(vHandle); //文件没被占用
return true;
}
#endregion
/// <summary>
/// 获取指定文件夹下所有的文件名称
/// </summary>
/// <param name="folderName">指定文件夹名称,绝对路径</param>
/// <param name="fileFilter">文件类型过滤,根据文件后缀名,如:*,*.txt,*.xls</param>
/// <param name="isContainSubFolder">是否包含子文件夹</param>
/// <returns>ArrayList数组,为所有需要的文件路径名称</returns>
public static List<FileInfo> GetAllFilesByFolder(string folderName, string fileFilter, bool isContainSubFolder = false)
{
List<FileInfo> resList = new List<FileInfo>();
try
{
DirectoryInfo currDir = new DirectoryInfo(folderName);//当前目录
FileInfo[] currFiles = currDir.GetFiles(fileFilter);//当前目录文件
foreach (FileInfo file in currFiles)
{
if (fileFilter.ToLower().IndexOf(file.Extension.ToLower()) >= 0)
{
resList.Add(file);
}
}
if (isContainSubFolder)
{
string[] subFolders = Directory.GetDirectories(folderName);
foreach (string subFolder in subFolders)
{
resList.AddRange(GetAllFilesByFolder(subFolder, fileFilter));//递归
}
}
}
catch (Exception ex)
{
throw ex;
}
return resList;
}
/// <summary>
/// 获取指定文件夹下所有的文件名称,不过滤文件类型
/// </summary>
/// <param name="folderName">指定文件夹名称,绝对路径</param>
/// <param name="isContainSubFolder">是否包含子文件夹</param>
/// <returns>ArrayList数组,为所有需要的文件路径名称</returns>
public static List<FileInfo> GetAllFilesByFolder(string folderName, bool isContainSubFolder)
{
return GetAllFilesByFolder(folderName, "*", isContainSubFolder);
}
}
public class Compare<T, C> : IEqualityComparer<T>
{
private Func<T, C> _getField;
public Compare(Func<T, C> getfield)
{
_getField = getfield;
}
public bool Equals(T x, T y)
{
return EqualityComparer<C>.Default.Equals(_getField(x), _getField(y));
}
public int GetHashCode(T obj)
{
return EqualityComparer<C>.Default.GetHashCode(_getField(obj));
}
}
public static class ObjectExtensions
{
public static IEnumerable<T> DistinctBy<T, C>(this IEnumerable<T> source, Func<T, C> getfield)
{
return source.Distinct(new Compare<T, C>(getfield));
}
public static IQueryable<T> DistinctBy<T, C>(this IQueryable<T> source, Func<T, C> getfield)
{
return source.Distinct(new Compare<T, C>(getfield));
}
}
}

View File

@ -0,0 +1,120 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace DH.Commons.Helper
{
/// <summary>
/// 配置文件操作工具类(自动定位主程序配置)
/// </summary>
public static class SystemConfigHelper
{
private static Configuration _mainConfig;
private static readonly object _lock = new object();
/// <summary>
/// 获取主程序配置对象
/// </summary>
private static Configuration MainConfiguration
{
get
{
if (_mainConfig == null)
{
lock (_lock)
{
if (_mainConfig == null)
{
// 获取主程序路径
string exePath = Assembly.GetEntryAssembly().Location;
var configFile = exePath + ".config";
// 加载主程序配置
var fileMap = new ExeConfigurationFileMap
{
ExeConfigFilename = configFile
};
_mainConfig = ConfigurationManager.OpenMappedExeConfiguration(
fileMap,
ConfigurationUserLevel.None
);
}
}
}
return _mainConfig;
}
}
/// <summary>
/// 检查配置项是否存在
/// </summary>
public static bool KeyExists(string key)
{
return MainConfiguration.AppSettings.Settings[key] != null;
}
/// <summary>
/// 读取配置项(带类型自动转换)
/// </summary>
public static T GetValue<T>(string key, T defaultValue = default)
{
try
{
var setting = MainConfiguration.AppSettings.Settings[key];
if (setting == null) return defaultValue;
return (T)Convert.ChangeType(setting.Value, typeof(T));
}
catch
{
return defaultValue;
}
}
/// <summary>
/// 写入配置项(自动保存)
/// </summary>
public static void SetValue(string key, object value)
{
var settings = MainConfiguration.AppSettings.Settings;
var stringValue = value?.ToString() ?? string.Empty;
if (settings[key] == null)
{
settings.Add(key, stringValue);
}
else
{
settings[key].Value = stringValue;
}
SaveChanges();
}
/// <summary>
/// 删除指定配置项
/// </summary>
public static void RemoveKey(string key)
{
if (KeyExists(key))
{
MainConfiguration.AppSettings.Settings.Remove(key);
SaveChanges();
}
}
/// <summary>
/// 保存配置修改
/// </summary>
private static void SaveChanges()
{
MainConfiguration.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
}
}
}

View File

@ -108,7 +108,7 @@ namespace DH.Commons.Enums
                DataGridViewCheckboxHeaderEventArgs ex = new DataGridViewCheckboxHeaderEventArgs();                 DataGridViewCheckboxHeaderEventArgs ex = new DataGridViewCheckboxHeaderEventArgs();
ex.CheckedState = _checked; ex.CheckedState = _checked;
object sender = new object();//此处不代表选择的列头checkbox只是作为参数传递 因为列头checkbox是绘制出来的无法获得它的实例 object sender = new object();//此处不代表选择的列头checkbox只是作为参数传递因为列头checkbox是绘制出来的无法获得它的实例
                if (OnCheckBoxClicked != null)                 if (OnCheckBoxClicked != null)
{ {

View File

@ -0,0 +1,109 @@

using System;
using System.ComponentModel;
using System.Drawing.Design;
namespace DH.Commons.Enums
{
/// <summary>
/// 标准配置
/// </summary>
public class Spec
{
[Category("通用配置")]
[Description("标准代码")]
public virtual string Code { get; set; }
[Category("通用配置")]
[Description("启用状态true启用false禁用")]
[DisplayName("启用状态")]
public bool IsEnabled { get; set; }
[Category("标准配置")]
[Description("标准值")]
[DisplayName("标准值")]
public double StandardValue { get; set; }
[Category("标准配置")]
[Description("正公差")]
[DisplayName("正公差")]
public double Tolrenance_Positive { get; set; }
[Category("标准配置")]
[Description("负公差")]
[DisplayName("负公差")]
public double Tolrenance_Negative { get; set; }
protected double? actualValue = null;
[Browsable(false)]
public virtual double? ActualValue
{
get
{
return actualValue;
}
set
{
//if (actualValue != value && value != null)
if (value != null)
{
if (value.Value >= (StandardValue - Tolrenance_Negative) && value.Value <= (StandardValue + Tolrenance_Positive))
{
MeasureResult = true;
}
else
{
MeasureResult = false;
}
}
actualValue = value;
}
}
[Browsable(false)]
public bool? MeasureResult { get; set; } = null;
public Spec Copy()
{
Spec spec = new Spec();
spec.Code = this.Code;
spec.IsEnabled = this.IsEnabled;
spec.StandardValue = this.StandardValue;
spec.Tolrenance_Positive = this.Tolrenance_Positive;
spec.Tolrenance_Negative = this.Tolrenance_Negative;
return spec;
}
}
public class IndexedSpec : Spec
{
[Category("数据源配置")]
[Description("数据源输出索引")]
[DisplayName("数据源输出索引")]
public int OutputIndex { get; set; }
public new IndexedSpec Copy()
{
IndexedSpec spec = new IndexedSpec();
spec.Code = this.Code;
spec.IsEnabled = this.IsEnabled;
spec.StandardValue = this.StandardValue;
spec.Tolrenance_Positive = this.Tolrenance_Positive;
spec.Tolrenance_Negative = this.Tolrenance_Negative;
spec.OutputIndex = this.OutputIndex;
return spec;
}
}
}

View File

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DH.Commons.Base;
using DH.Commons.Enums;
namespace DH.Commons.Models
{
public static class SystemModel
{
/// <summary>
/// 当前方案
/// </summary>
public static string CurrentScheme=string.Empty;
/// <summary>
/// 当前状态
/// </summary>
public static EnumStatus CurrentStatus =EnumStatus.;
}
/// <summary>
/// 配置集合
/// </summary>
public static class ConfigModel
{
public static List<CameraBase> CameraBaseList = new List<CameraBase>();
public static List<PLCBase> PLCBaseList = new List<PLCBase>();
public static List<DetectionConfig> DetectionList = new List<DetectionConfig>();
public static List<GlobalConfig> GlobalList = new List<GlobalConfig>();
}
}

View File

@ -24,7 +24,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\DH.Commons.Devies\DH.Commons.Devies.csproj" />
<ProjectReference Include="..\DH.Commons\DH.Commons.csproj" /> <ProjectReference Include="..\DH.Commons\DH.Commons.csproj" />
</ItemGroup> </ItemGroup>

View File

@ -1,17 +1,21 @@
using System.Diagnostics; using System.Collections.Concurrent;
using System.Diagnostics;
using System.Reflection.Metadata; using System.Reflection.Metadata;
using System.Xml.Linq; using System.Xml.Linq;
using DH.Devices.Devices; using DH.Commons.Base;
using DH.Commons.Enums;
using DH.Commons.Helper;
using DVPCameraType; using DVPCameraType;
using OpenCvSharp; using OpenCvSharp;
using OpenCvSharp.Extensions;
using static System.Net.Mime.MediaTypeNames; using static System.Net.Mime.MediaTypeNames;
using LogLevel = DH.Commons.Enums.EnumHelper.LogLevel;
namespace DH.Devices.Camera namespace DH.Devices.Camera
{ {
public class Do3ThinkCamera : CameraBase public class Do3ThinkCamera : CameraBase, ILogger
{ {
private dvpCameraInfo stDevInfo = new dvpCameraInfo(); private dvpCameraInfo stDevInfo = new dvpCameraInfo();
@ -24,8 +28,16 @@ namespace DH.Devices.Camera
public dvpStreamFormat dvpStreamFormat = dvpStreamFormat.S_RGB24; public dvpStreamFormat dvpStreamFormat = dvpStreamFormat.S_RGB24;
public int m_CamCount = 0; public int m_CamCount = 0;
public Double m_dfDisplayCount = 0; public Double m_dfDisplayCount = 0;
public LoggerHelper LoggerHelper { get; set; } = new LoggerHelper();
public event Action<LogMsg> OnLog;
public ConcurrentDictionary<string, MatSet> _imageSetList = new ConcurrentDictionary<string, MatSet>();
public Do3ThinkCamera() public Do3ThinkCamera()
{ {
LoggerHelper.LogPath = "D://";
LoggerHelper.LogPrefix = CameraName;
} }
@ -78,17 +90,17 @@ namespace DH.Devices.Camera
//GC.KeepAlive(pCallBackFunc); //GC.KeepAlive(pCallBackFunc);
//// ch:设置采集连续模式 | en:Set Continues Aquisition Mode //// ch:设置采集连续模式 | en:Set Continues Aquisition Mode
//if (IIConfig.IsContinueMode) if (IsContinueMode)
//{ {
// // ch:设置触发模式为off || en:set trigger mode as off // ch:设置触发模式为off || en:set trigger mode as off
// nRet = DVPCamera.dvpSetTriggerState(m_handle, false); nRet = DVPCamera.dvpSetTriggerState(m_handle, false);
// if (dvpStatus.DVP_STATUS_OK != nRet) if (dvpStatus.DVP_STATUS_OK != nRet)
// { {
// throw new Exception("Set TriggerMode failed!"); throw new Exception("Set TriggerMode failed!");
// } }
//} }
//else else
//{ {
// ch:设置触发模式为on || en:set trigger mode as on // ch:设置触发模式为on || en:set trigger mode as on
nRet = DVPCamera.dvpSetTriggerState(m_handle, true); nRet = DVPCamera.dvpSetTriggerState(m_handle, true);
if (dvpStatus.DVP_STATUS_OK != nRet) if (dvpStatus.DVP_STATUS_OK != nRet)
@ -97,8 +109,8 @@ namespace DH.Devices.Camera
} }
// 硬触发 // 硬触发
//if (IIConfig.IsHardwareTrigger) if (IsHardwareTrigger)
//{ {
// ch:触发源选择:1 - Line1; | en:Trigger source select:1 - Line1; // ch:触发源选择:1 - Line1; | en:Trigger source select:1 - Line1;
nRet = DVPCamera.dvpSetTriggerSource(m_handle, dvpTriggerSource.TRIGGER_SOURCE_LINE1); nRet = DVPCamera.dvpSetTriggerSource(m_handle, dvpTriggerSource.TRIGGER_SOURCE_LINE1);
if (dvpStatus.DVP_STATUS_OK != nRet) if (dvpStatus.DVP_STATUS_OK != nRet)
@ -113,15 +125,15 @@ namespace DH.Devices.Camera
{ {
throw new Exception("Register image callback failed!"); throw new Exception("Register image callback failed!");
} }
//} }
//else // 软触发 else // 软触发
//{ {
// nRet = DVPCamera.dvpSetTriggerSource(m_handle, dvpTriggerSource.TRIGGER_SOURCE_SOFTWARE); nRet = DVPCamera.dvpSetTriggerSource(m_handle, dvpTriggerSource.TRIGGER_SOURCE_SOFTWARE);
// if (dvpStatus.DVP_STATUS_OK != nRet) if (dvpStatus.DVP_STATUS_OK != nRet)
// { {
// throw new Exception("Set Software Trigger failed!"); throw new Exception("Set Software Trigger failed!");
// } }
//} }
// ch:开启抓图 || en: start grab image // ch:开启抓图 || en: start grab image
nRet = DVPCamera.dvpStart(m_handle); nRet = DVPCamera.dvpStart(m_handle);
@ -130,40 +142,44 @@ namespace DH.Devices.Camera
throw new Exception($"Start grabbing failed:{nRet:x8}"); throw new Exception($"Start grabbing failed:{nRet:x8}");
} }
//// 曝光 //// 曝光
//if (IIConfig.DefaultExposure != 0) if (Exposure != 0)
//{ {
// SetExposure(IIConfig.DefaultExposure); SetExposure(Exposure);
//} }
//// 增益 //// 增益
//if (IIConfig.Gain >= 0) if (Gain >= 0)
//{ {
// SetGain(IIConfig.Gain); SetGain(Gain);
//} }
//SetPictureRoi(IIConfig.VelocityPara.A_Pic_X, IIConfig.VelocityPara.A_Pic_Y, IIConfig.VelocityPara.Width, IIConfig.VelocityPara.Hight); //全画幅
if(!IsAllPicEnabled)
SetPictureRoi((int)ROIX, (int)ROIY, (int)ROIW, (int)ROIH);
//// 设置 触发延迟 //// 设置 触发延迟
//if (IIConfig.TriggerDelay > 0) if (TriggerDelay > 0)
//{ {
// nRet = DVPCamera.dvpSetTriggerDelay(m_handle, IIConfig.TriggerDelay); nRet = DVPCamera.dvpSetTriggerDelay(m_handle, TriggerDelay);
// if (nRet != dvpStatus.DVP_STATUS_OK) if (nRet != dvpStatus.DVP_STATUS_OK)
// { {
// throw new Exception("Set TriggerDelay failed!"); throw new Exception("Set TriggerDelay failed!");
// } }
//} }
//// 信号消抖 //// 信号消抖
//if (IIConfig.LineDebouncerTime > 0) if (LineDebouncerTime > 0)
//{ {
// nRet = DVPCamera.dvpSetTriggerJitterFilter(m_handle, IIConfig.LineDebouncerTime); nRet = DVPCamera.dvpSetTriggerJitterFilter(m_handle, LineDebouncerTime);
// if (nRet != dvpStatus.DVP_STATUS_OK) if (nRet != dvpStatus.DVP_STATUS_OK)
// { {
// throw new Exception($"LineDebouncerTime set failed:{nRet}"); throw new Exception($"LineDebouncerTime set failed:{nRet}");
// } }
//} }
//IIConfig.PropertyChanged -= IIConfig_PropertyChanged; //IIConfig.PropertyChanged -= IIConfig_PropertyChanged;
//IIConfig.PropertyChanged += IIConfig_PropertyChanged; //IIConfig.PropertyChanged += IIConfig_PropertyChanged;
}
return true; return true;
} }
catch catch
@ -349,9 +365,17 @@ namespace DH.Devices.Camera
break; break;
} }
Mat smat = cvImage.Clone(); Mat smat = cvImage.Clone();
var imageSet = new MatSet
{
_mat = smat,
};
InitialImageSet(imageSet);
OnHImageOutput?.Invoke(DateTime.Now, this, smat); OnHImageOutput?.Invoke(DateTime.Now, this, smat);
//存图
DisplayAndSaveOriginImage(imageSet.Id,SnapshotCount);
@ -367,14 +391,93 @@ namespace DH.Devices.Camera
} }
return 0; return 0;
} }
public void InitialImageSet(MatSet set)
{
//if (saveOption != null)
//{
// set.ImageSaveOption = saveOption.Copy();
//}
//set.IsOriginSaved = !set.ImageSaveOption.IsSaveOriginImage;
//set.IsFitSaved = !set.ImageSaveOption.IsSaveFitImage;
//set.IsAddtionalSaved = string.IsNullOrWhiteSpace(set.ImageSaveOption.AddtionalSaveType);
set.CameraId = this.CameraName;
set.ImageTime = DateTime.Now;
_imageSetList[set.Id] = set;
}
public virtual async void DisplayAndSaveOriginImage(string imgSetId, int _counter)
{
MatSet set = _imageSetList.Values.FirstOrDefault(u => u.Id == imgSetId);
if (set != null && set._mat != null)
{
await Task.Run(() =>
{
Bitmap showImage = set._mat.ToBitmap();
// showImage.Save("D:/test333.bmp");
// Marshal.Copy(pbyteImageBuffer, 0, (IntPtr)lAddrImage, (int)dwBufferSize);
// Bitmap saveImage = showImage?.CopyBitmap();
// saveImage.Save("d://TEST444.BMP");
// OnShowImageUpdated?.Invoke(this, showImage, imgSetId);
if (IsSavePicEnabled)
{
string fullname = Path.Combine(ImageSaveDirectory, $"{CameraName}_{_counter:D7}_{set.Id}.{set._imageFormat.ToString().ToLower()}");
ImageSaveAsync(fullname, showImage);
}
//释放 himage
ClearImageSet(set);
});
}
}
static object _imageSetLock = new object();
public void ClearImageSet(MatSet set)
{
try
{
bool flag = false;
lock (_imageSetLock)
{
flag = _imageSetList.TryRemove(set.Id, out set);
if (flag)
{
set.Dispose();
}
//LogAsync(DateTime.Now, $"{Name}移除图片信息{(flag ? "成功" : "失败")},当前缓存数量:{_imageSetList.Count}", "");
}
}
catch (Exception ex)
{
LogAsync(DateTime.Now, LogLevel.Exception, $"清理图片缓存异常,当前缓存数量{_imageSetList.Count},{ex.GetExceptionMessage()}");
}
}
public ImageSaveHelper ImageSaveHelper { get; set; } = new ImageSaveHelper();
public virtual void ImageSaveAsync(string fullName, Bitmap map)
{
if (!IsSavePicEnabled)
{
map?.Dispose();
return;
}
ImageSaveSet imageSaveSet = new ImageSaveSet()
{
FullName = fullName,
SaveImage = map,
};
ImageSaveHelper.ImageSaveAsync(imageSaveSet);
}
public override bool CameraDisConnect() public override bool CameraDisConnect()
{ {
try try
{ {
dvpStreamState StreamState = new dvpStreamState(); dvpStreamState StreamState = new dvpStreamState();
nRet = DVPCamera.dvpGetStreamState(m_handle, ref StreamState); nRet = DVPCamera.dvpGetStreamState(m_handle, ref StreamState);
Debug.Assert(nRet == dvpStatus.DVP_STATUS_OK); //Debug.Assert(nRet == dvpStatus.DVP_STATUS_OK);
if (StreamState == dvpStreamState.STATE_STARTED) if (StreamState == dvpStreamState.STATE_STARTED)
{ {
// stop camera // stop camera
@ -409,6 +512,22 @@ namespace DH.Devices.Camera
} }
public void LogAsync(LogMsg msg)
{
msg.MsgSource = CameraName;
msg.ThreadId = Thread.CurrentThread.ManagedThreadId;
//OnLog?.BeginInvoke(msg, null, null);
OnLog?.Invoke(msg);
//if (InitialConfig.IsEnableLog)
{
LoggerHelper.LogAsync(msg);
}
}
public void LogAsync(DateTime dt, LogLevel logLevel, string msg)
{
LogAsync(new LogMsg(dt, logLevel, msg));
}
} }
} }

View File

@ -5,7 +5,7 @@ using System.Runtime.InteropServices;
using System.Xml.Linq; using System.Xml.Linq;
using DH.Commons.Enums; using DH.Commons.Enums;
using static MvCamCtrl.NET.MyCamera; using static MvCamCtrl.NET.MyCamera;
using DH.Devices.Devices; using DH.Commons.Base;

View File

@ -409,7 +409,7 @@ namespace MCDLL_NET
/******************************************************************************************************************************************************************** /********************************************************************************************************************************************************************
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ݡ<EFBFBD>
********************************************************************************************************************************************************************/ ********************************************************************************************************************************************************************/
@ -1005,8 +1005,8 @@ namespace MCDLL_NET
/// </summary> /// </summary>
/// <param name="Axis"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param> /// <param name="Axis"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="Stop_Time"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣʱ<CDA3><20><>Χ 0 -1000ms<6D><73><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>ͣ<EFBFBD><CDA3> /// <param name="Stop_Time"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣʱ<CDA3><20><>Χ 0 -1000ms<6D><73><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD>ͣ<EFBFBD><CDA3>
/// ע<><EFBFBD><E2A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײԭ<D7B2>㻺ͣʱ<CDA3><EFBFBD><E4A3AC>Ҫ<EFBFBD><D2AA><EFBFBD>ϻ<EFBFBD><CFBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĸ<C3B5><C4B8>ٶ<EFBFBD><D9B6>ٶȣ<D9B6><C8A3>͵<EFBFBD><CDB5>ٶ<EFBFBD><D9B6>ٶȵĴ<C8B5><C4B4><EFBFBD> /// ע<><EFBFBD><E2A3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײԭ<D7B2>㻺ͣʱ<CDA3><EFBFBD><E4A3AC>Ҫ<EFBFBD><D2AA><EFBFBD>ϻ<EFBFBD><CFBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĸ<C3B5><C4B8>ٶ<EFBFBD><D9B6>ٶȣ<D9B6><C8A3>͵<EFBFBD><CDB5>ٶ<EFBFBD><D9B6>ٶȵĴ<C8B5><C4B4>
/// <20><><EFBFBD>ô<EFBFBD><C3B4>˻<EFBFBD><CBBB><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>ԭ<EFBFBD><D4AD>ʱ<EFBFBD><CAB1><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD>м<EFBFBD> </param> /// <20><><EFBFBD>ô<EFBFBD><C3B4>˻<EFBFBD><CBBB><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1>ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD>ԭ<EFBFBD><D4AD>ʱ<EFBFBD><CAB1><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD>м</param>
/// <param name="StationNumber">վ<><D5BE><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD>Ϊ 0</param> /// <param name="StationNumber">վ<><D5BE><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD>Ϊ 0</param>
/// <returns></returns> /// <returns></returns>
[DllImport("MCDLL_NET.DLL", EntryPoint = "MCF_Search_Home_Stop_Time_Net")] [DllImport("MCDLL_NET.DLL", EntryPoint = "MCF_Search_Home_Stop_Time_Net")]

View File

@ -444,17 +444,17 @@ namespace DH.Devices.Motion
//[Category("回原点设置")] //[Category("回原点设置")]
//[DisplayName("回原点模式")] //[DisplayName("回原点模式")]
//[Description("HomeMode回原点模式 0一般模式 1极限限位模式 2外部触发模式")] //[Description("HomeMode回原点模式0一般模式 1极限限位模式 2外部触发模式")]
//public int HomeMode { get; set; } = 0; //public int HomeMode { get; set; } = 0;
//[Category("回原点设置")] //[Category("回原点设置")]
//[DisplayName("回原点方向")] //[DisplayName("回原点方向")]
//[Description("IsHomePositive回原点方向 true正方向开始 false负方向开始")] //[Description("IsHomePositive回原点方向 true正方向开始 false负方向开始")]
//public bool IsHomePositive { get; set; } = true; //public bool IsHomePositive { get; set; } = true;
//[Category("回原点设置")] //[Category("回原点设置")]
//[DisplayName("是否自动回原点")] //[DisplayName("是否自动回原点")]
//[Description("IsAutoGoHome是否自动回原点 true是 false否")] //[Description("IsAutoGoHome是否自动回原点 true是 false否")]
//public bool IsAutoGoHome { get; set; } = false; //public bool IsAutoGoHome { get; set; } = false;
//[Category("超时设置")] //[Category("超时设置")]
@ -601,7 +601,7 @@ namespace DH.Devices.Motion
[Category("回原点参数")] [Category("回原点参数")]
[DisplayName("碰撞原点缓停时间")] [DisplayName("碰撞原点缓停时间")]
[Description("SearchHomeStopTime触发缓停时间范围 0-1000ms默认急停 注意:设置碰撞原点缓停时间,需要配合回零设置的高速段速度,和低速度速度的搭配 设置大了会出现过冲的现象,设置小了停止的时候会有抖动,需要调节时间,尽量设置找到原点时候在开关中间 ")] [Description("SearchHomeStopTime触发缓停时间范围 0-1000ms默认急停注意:设置碰撞原点缓停时间,需要配合回零设置的高速段速度,和低速度速度的搭配设置大了会出现过冲的现象,设置小了停止的时候会有抖动,需要调节时间,尽量设置找到原点时候在开关中间")]
public ushort SearchHomeStopTime { get; set; } = 0; public ushort SearchHomeStopTime { get; set; } = 0;

View File

@ -314,9 +314,9 @@ namespace DH.Devices.Motion
// //设置物件检测有效电平 0是低电平 1是高电平 // //设置物件检测有效电平 0是低电平 1是高电平
// rtn = CMCDLL_NET_Sorting.MCF_Sorting_Set_Input_Logic_Net((ushort)SortingInputSetting.BitInputNumber, 0); // rtn = CMCDLL_NET_Sorting.MCF_Sorting_Set_Input_Logic_Net((ushort)SortingInputSetting.BitInputNumber, 0);
// //设置来料检测编码器 双转盘要设置两个轴 // //设置来料检测编码器 双转盘要设置两个轴
// /*Bit_Input_Number设置位号 // /*Bit_Input_Number设置位号
// 取值: Bit_Input_0, Bit_Input_1 // 取值: Bit_Input_0, Bit_Input_1
// Axis: 轴号 // Axis: 轴号
// Source跟随方式 // Source跟随方式
// 取值0命令 // 取值0命令
// 1编码器(默认) // 1编码器(默认)
@ -1655,7 +1655,7 @@ namespace DH.Devices.Motion
#region IMonitor #region IMonitor
/// <summary> /// <summary>
/// 位置捕获监听,入料检测 /// 位置捕获监听,入料检测
/// 入料检测对射开关接到了HOME口每当有新料到达入料检测传感器时程序把当前位置当作原点并调用<see cref="SolidMotionCardBase.CapturePositionChanged(int, int)"/>函数 /// 入料检测对射开关接到了HOME口每当有新料到达入料检测传感器时程序把当前位置当作原点并调用<see cref="SolidMotionCardBase.CapturePositionChanged(int, int)"/>函数
/// </summary> /// </summary>
private void MonitorPieces() private void MonitorPieces()
@ -1796,7 +1796,7 @@ namespace DH.Devices.Motion
// Picese_sizeStr += i.ToString()+":"+Piece_Size[i]+"\t"; // Picese_sizeStr += i.ToString()+":"+Piece_Size[i]+"\t";
// Picese_DistanceizeStr += i.ToString()+":"+ Piece_Distance_To_next[i]+"\t"; // Picese_DistanceizeStr += i.ToString()+":"+ Piece_Distance_To_next[i]+"\t";
//} //}
// LogAsync(DateTime.Now, LogLevel.Information, $"转盘{station}产品入列 , {piecesCountDic[station]} size:{Piece_Size[Piece_Size.Length - 1]} "); // LogAsync(DateTime.Now, LogLevel.Information, $"转盘{station}产品入列 , {piecesCountDic[station]} size:{Piece_Size[Piece_Size.Length - 1]}");
// LogAsync(DateTime.Now, LogLevel.Information, $"转盘{station}产品入列 ,监听piece_find{tmpPieceNumber} 监听物件大小" + Picese_sizeStr+",物件间距"+ Picese_DistanceizeStr+"相机经过个数"+Piece_Cross_Camera); // LogAsync(DateTime.Now, LogLevel.Information, $"转盘{station}产品入列 ,监听piece_find{tmpPieceNumber} 监听物件大小" + Picese_sizeStr+",物件间距"+ Picese_DistanceizeStr+"相机经过个数"+Piece_Cross_Camera);
if (tmpPieceNumber != piecesCountDic[station] + 1) if (tmpPieceNumber != piecesCountDic[station] + 1)
{ {

View File

@ -12,10 +12,6 @@
<Platforms>AnyCPU;x64</Platforms> <Platforms>AnyCPU;x64</Platforms>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="System.IO.Ports" Version="9.0.2" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\DH.Commons\DH.Commons.csproj" /> <ProjectReference Include="..\DH.Commons\DH.Commons.csproj" />
</ItemGroup> </ItemGroup>

View File

@ -1,81 +0,0 @@
using System.IO.Ports;
using DH.Commons.Enums;
using HslCommunication;
namespace DH.Devices.PLC
{
public class PLCBase
{
/// <summary>
/// 连接状态
/// </summary>
public bool connected = false;
/// <summary>
/// 类型
/// </summary>
public EnumPLCType PLCType=EnumPLCType.XD_网口;
/// <summary>
/// 串口号
/// </summary>
public string portName="COM1";
/// <summary>
/// 波特率
/// </summary>
public int baudRate = 9600;
/// <summary>
/// 数据位
/// </summary>
public int dataBit = 8;
/// <summary>
/// 停止位
/// </summary>
public StopBits stopBit = (StopBits)Enum.Parse(typeof(StopBits), "One");
/// <summary>
/// 奇偶效验位
/// </summary>
public Parity parity = (Parity)Enum.Parse(typeof(Parity), "None");
/// <summary>
/// IP地址
/// </summary>
public string IP = "192.168.6.6";
/// <summary>
/// 端口号
/// </summary>
public int Port = 502;
/// <summary>
/// 初始化
/// </summary>
/// <returns></returns>
public virtual bool PLCConnect() { return false; }
public virtual bool PLCDisConnect() { return false; }
public virtual ushort ReadShort(string address) { return 0; }
public virtual int ReadInt(string address) { return 0; }
public virtual float ReadFloat(string address) { return 0; }
public virtual bool ReadBool(string address) { return false; }
public virtual bool WriteShort(string address, short value, bool waitForReply = true) { return false; }
public virtual bool WriteInt(string address, int value, bool waitForReply = true) { return false; }
public virtual bool WriteDInt(string address, int value, bool waitForReply = true) { return false; }
public virtual bool WriteFloat(string address, float value, bool waitForReply = true) { return false; }
public virtual bool WriteBool(string address, bool value, bool waitForReply = true) { return false; }
}
}

File diff suppressed because it is too large Load Diff

View File

@ -11,6 +11,14 @@
<Platforms>AnyCPU;x64</Platforms> <Platforms>AnyCPU;x64</Platforms>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<Optimize>False</Optimize>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Optimize>False</Optimize>
</PropertyGroup>
@ -28,7 +36,6 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\DH.Commons.Devies\DH.Commons.Devies.csproj" />
<ProjectReference Include="..\DH.Commons\DH.Commons.csproj" /> <ProjectReference Include="..\DH.Commons\DH.Commons.csproj" />
<ProjectReference Include="..\DH.UI.Model.Winform\DH.UI.Model.Winform.csproj" /> <ProjectReference Include="..\DH.UI.Model.Winform\DH.UI.Model.Winform.csproj" />
</ItemGroup> </ItemGroup>

View File

@ -13,7 +13,7 @@ using System.Threading.Tasks;
using System.Security.Cryptography.Xml; using System.Security.Cryptography.Xml;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using Newtonsoft.Json; using Newtonsoft.Json;
using DH.Commons.Enums; using DH.Commons.Base;
@ -104,18 +104,18 @@ namespace DH.Devices.Vision
// json = "{\"FastDetResult\":[{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654843,\"rect\":[175,99,110,594]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654589,\"rect\":[2608,19,104,661]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654285,\"rect\":[1275,19,104,662]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.620762,\"rect\":[1510,95,107,600]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.617812,\"rect\":[2844,93,106,602]}]}"; // json = "{\"FastDetResult\":[{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654843,\"rect\":[175,99,110,594]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654589,\"rect\":[2608,19,104,661]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654285,\"rect\":[1275,19,104,662]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.620762,\"rect\":[1510,95,107,600]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.617812,\"rect\":[2844,93,106,602]}]}";
// //
Console.WriteLine("检测结果JSON" + json); Console.WriteLine("检测结果JSON" + json);
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
HYoloResult detResult = JsonConvert.DeserializeObject<HYoloResult>(json); HYoloResult detResult = JsonConvert.DeserializeObject<HYoloResult>(json);
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
if (detResult == null) if (detResult == null)
{ {
return; return;
} }
int iNum = detResult.HYolo.Count; int iNum = detResult.HYolo.Count;
#pragma warning disable CS0219 // 变量已被赋值,但从未使用过它的值
int IokNum = 0; int IokNum = 0;
#pragma warning restore CS0219 // 变量已被赋值,但从未使用过它的值
for (int ix = 0; ix < iNum; ix++) for (int ix = 0; ix < iNum; ix++)
{ {
var det = detResult.HYolo[ix]; var det = detResult.HYolo[ix];
@ -145,7 +145,6 @@ namespace DH.Devices.Vision
Mat originMat = new Mat(); Mat originMat = new Mat();
Mat detectMat = new Mat(); Mat detectMat = new Mat();
#pragma warning disable CS0168 // 声明了变量,但从未使用过
try try
{ {
if (req.mImage == null) if (req.mImage == null)
@ -234,15 +233,15 @@ namespace DH.Devices.Vision
{ {
originMat?.Dispose(); originMat?.Dispose();
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型 #pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
originMat = null; originMat = null;
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型 #pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
//maskMat?.Dispose(); //maskMat?.Dispose();
// maskMat = null; // maskMat = null;
detectMat?.Dispose(); detectMat?.Dispose();
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型 #pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
detectMat = null; detectMat = null;
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型 #pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
// maskWeighted?.Dispose(); // maskWeighted?.Dispose();
// maskWeighted = null; // maskWeighted = null;
// GC.Collect(); // GC.Collect();

View File

@ -12,7 +12,7 @@ using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using Newtonsoft.Json; using Newtonsoft.Json;
using DH.Commons.Enums; using DH.Commons.Base;
namespace DH.Devices.Vision namespace DH.Devices.Vision
@ -127,9 +127,9 @@ namespace DH.Devices.Vision
// json = "{\"FastDetResult\":[{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654843,\"rect\":[175,99,110,594]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654589,\"rect\":[2608,19,104,661]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654285,\"rect\":[1275,19,104,662]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.620762,\"rect\":[1510,95,107,600]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.617812,\"rect\":[2844,93,106,602]}]}"; // json = "{\"FastDetResult\":[{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654843,\"rect\":[175,99,110,594]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654589,\"rect\":[2608,19,104,661]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654285,\"rect\":[1275,19,104,662]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.620762,\"rect\":[1510,95,107,600]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.617812,\"rect\":[2844,93,106,602]}]}";
// //
Console.WriteLine("检测结果JSON" + json); Console.WriteLine("检测结果JSON" + json);
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型 #pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
SegResult detResult = JsonConvert.DeserializeObject<SegResult>(json); SegResult detResult = JsonConvert.DeserializeObject<SegResult>(json);
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型 #pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
if (detResult == null) if (detResult == null)
{ {
return; return;
@ -259,9 +259,9 @@ namespace DH.Devices.Vision
{ {
originMat?.Dispose(); originMat?.Dispose();
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型 #pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
originMat = null; originMat = null;
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型 #pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
// GC.Collect(); // GC.Collect();

View File

@ -13,7 +13,7 @@ using System.Threading.Tasks;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Xml; using System.Xml;
using DH.Commons.Enums; using DH.Commons.Base;
namespace DH.Devices.Vision namespace DH.Devices.Vision
@ -136,9 +136,8 @@ namespace DH.Devices.Vision
// json = "{\"FastDetResult\":[{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654843,\"rect\":[175,99,110,594]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654589,\"rect\":[2608,19,104,661]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654285,\"rect\":[1275,19,104,662]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.620762,\"rect\":[1510,95,107,600]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.617812,\"rect\":[2844,93,106,602]}]}"; // json = "{\"FastDetResult\":[{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654843,\"rect\":[175,99,110,594]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654589,\"rect\":[2608,19,104,661]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.654285,\"rect\":[1275,19,104,662]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.620762,\"rect\":[1510,95,107,600]},{\"cls_id\":0,\"cls\":\"liewen\",\"fScore\":0.617812,\"rect\":[2844,93,106,602]}]}";
// //
Console.WriteLine("检测结果JSON" + json); Console.WriteLine("检测结果JSON" + json);
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
SegResult detResult = JsonConvert.DeserializeObject<SegResult>(json); SegResult detResult = JsonConvert.DeserializeObject<SegResult>(json);
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
if (detResult == null) if (detResult == null)
{ {
return; return;
@ -176,7 +175,6 @@ namespace DH.Devices.Vision
MLResult mlResult = new MLResult(); MLResult mlResult = new MLResult();
Mat originMat=new Mat() ; Mat originMat=new Mat() ;
Mat detectMat= new Mat(); Mat detectMat= new Mat();
#pragma warning disable CS0168 // 声明了变量,但从未使用过
try try
{ {
if (req.mImage == null) if (req.mImage == null)
@ -266,25 +264,24 @@ namespace DH.Devices.Vision
// 释放 Mat 资源 // 释放 Mat 资源
if (detectMat != null) if (detectMat != null)
{ {
detectMat.Dispose();
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
detectMat = null; detectMat = null;
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
} }
if (originMat != null) if (originMat != null)
{ {
originMat.Dispose(); originMat.Dispose();
#pragma warning disable CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
originMat = null; originMat = null;
#pragma warning restore CS8600 // 将 null 字面量或可能为 null 的值转换为非 null 类型
} }
// GC.Collect(); // GC.Collect();
} }
#pragma warning restore CS0168 // 声明了变量,但从未使用过
} }

View File

@ -1,5 +1,6 @@
using DH.Commons.Enums; using DH.Commons.Base;
using DH.Devices.Devices; using DH.Commons.Enums;
using DH.Commons.Helper;
using DH.UI.Model.Winform; using DH.UI.Model.Winform;
using HalconDotNet; using HalconDotNet;
using OpenCvSharp; using OpenCvSharp;
@ -7,6 +8,8 @@ using OpenCvSharp.Extensions;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Diagnostics.Eventing.Reader;
using System.Drawing.Imaging;
using System.Linq; using System.Linq;
using System.Runtime.ExceptionServices; using System.Runtime.ExceptionServices;
using System.Text; using System.Text;
@ -15,7 +18,8 @@ using System.Windows.Forms;
using System.Xml.Linq; using System.Xml.Linq;
using XKRS.UI.Model.Winform; using XKRS.UI.Model.Winform;
using static DH.Commons.Enums.EnumHelper; using static DH.Commons.Enums.EnumHelper;
using ResultState = DH.Commons.Enums.ResultState; using LogLevel = DH.Commons.Enums.EnumHelper.LogLevel;
using ResultState = DH.Commons.Base.ResultState;
namespace DH.Devices.Vision namespace DH.Devices.Vision
@ -36,7 +40,20 @@ namespace DH.Devices.Vision
// ImageSaveHelper.OnImageSaveExceptionRaised += ImageSaveHelper_OnImageSaveExceptionRaised; // ImageSaveHelper.OnImageSaveExceptionRaised += ImageSaveHelper_OnImageSaveExceptionRaised;
// base.Init(); // base.Init();
} }
public void Stop()
{
SimboStationMLEngineList.ToList().ForEach(sm =>
{
if (sm.IsUseGPU)
{
sm.StationMLEngine.Dispose();
}
else
{
sm.StationMLEngine.Dispose2();
}
});
}
//private void ImageSaveHelper_OnImageSaveExceptionRaised(DateTime dt, string msg) //private void ImageSaveHelper_OnImageSaveExceptionRaised(DateTime dt, string msg)
//{ //{
// LogAsync(new LogMsg(dt, LogLevel.Error, msg)); // LogAsync(new LogMsg(dt, LogLevel.Error, msg));
@ -57,16 +74,30 @@ namespace DH.Devices.Vision
if (detectConfig == null) if (detectConfig == null)
{ {
LogAsync(DateTime.Now, LogLevel.Exception, $"异常:未能获取检测配置");
//未能获得检测配置 //未能获得检测配置
return detectResult; return detectResult;
} }
detectResult.DetectName = detectConfig.Name;
detectResult.ImageSaveDirectory=detectConfig.ImageSaveDirectory;
detectResult.SaveNGDetect=detectConfig.SaveNGDetect;
detectResult.SaveNGOriginal=detectConfig.SaveNGOriginal;
detectResult.SaveOKDetect=detectConfig.SaveOKDetect;
detectResult.SaveOKOriginal=detectConfig.SaveOKOriginal;
Mat OriginImage = originImgSet.Clone();
detectResult.DetectionOriginImage = CopyBitmapWithLockBits(OriginImage.ToBitmap());
//detectResult.DetectionOriginImage = originImgSet.Clone().ToBitmap();
Stopwatch sw = new Stopwatch();
#region 1. #region 1.
sw.Start();
using (Mat PreTMat = originImgSet.Clone()) using (Mat PreTMat = originImgSet.Clone())
{ {
PreTreated(detectConfig, detectResult, PreTMat); PreTreated(detectConfig, detectResult, PreTMat);
PreTreated2(detectConfig, detectResult, PreTMat);
} }
sw.Stop();
LogAsync(DateTime.Now, LogLevel.Information, $"产品:{detectResult.Pid} {detectConfig.Name}预处理耗时:{sw.ElapsedMilliseconds}ms。SpecsResults{string.Join("", detectResult.realSpecs.Select(u => $"{u.Code} {u.ActualValue}"))}");
// 工位2尺寸测量
@ -98,7 +129,7 @@ namespace DH.Devices.Vision
} }
#region 2. #region 2.
//LogAsync(DateTime.Now, LogLevel.Information, $"{detectConfig.Name} 产品{detectResult.TempPid} 模型检测执行"); LogAsync(DateTime.Now, LogLevel.Information, $"{detectConfig.Name} 产品{detectResult.TempPid} 模型检测执行");
if (!string.IsNullOrWhiteSpace(detectConfig.ModelPath)) if (!string.IsNullOrWhiteSpace(detectConfig.ModelPath))
{ {
@ -113,7 +144,7 @@ namespace DH.Devices.Vision
// req.Score = IIConfig.Score; // req.Score = IIConfig.Score;
req.mImage = originImgSet.Clone(); req.mImage = originImgSet.Clone();
req.in_lable_path = detectConfig.in_lable_path; req.in_lable_path = detectConfig.In_lable_path;
req.confThreshold = detectConfig.ModelconfThreshold; req.confThreshold = detectConfig.ModelconfThreshold;
req.iouThreshold = 0.3f; req.iouThreshold = 0.3f;
@ -121,16 +152,16 @@ namespace DH.Devices.Vision
req.out_node_name = "output0"; req.out_node_name = "output0";
switch (detectConfig.ModelType) switch (detectConfig.ModelType)
{ {
case MLModelType.ImageClassification: case ModelType.:
break; break;
case MLModelType.ObjectDetection: case ModelType.:
break; break;
case MLModelType.SemanticSegmentation: case ModelType.:
break; break;
case MLModelType.InstanceSegmentation: case ModelType.:
break; break;
case MLModelType.ObjectGPUDetection: case ModelType.GPU:
break; break;
default: default:
@ -140,7 +171,7 @@ namespace DH.Devices.Vision
// LogAsync(DateTime.Now, LogLevel.Information, $"{detectConfig.Name} 产品{detectResult.TempPid} RunInference BEGIN"); // LogAsync(DateTime.Now, LogLevel.Information, $"{detectConfig.Name} 产品{detectResult.TempPid} RunInference BEGIN");
mlWatch.Start(); mlWatch.Start();
//20230802改成多线程推理 RunInferenceFixed //20230802改成多线程推理 RunInferenceFixed
// MLResult result = new MLResult();
var result = mlSet.StationMLEngine.RunInference(req); var result = mlSet.StationMLEngine.RunInference(req);
// var result = mlSet.StationMLEngine.RunInferenceFixed(req); // var result = mlSet.StationMLEngine.RunInferenceFixed(req);
mlWatch.Stop(); mlWatch.Stop();
@ -180,6 +211,8 @@ namespace DH.Devices.Vision
if (result == null || (result != null && !result.IsSuccess)) if (result == null || (result != null && !result.IsSuccess))
{ {
LogAsync(DateTime.Now, LogLevel.Exception, $"CoreInx:{mlSet.GPUNo} 产品:{detectResult.Pid} {detectConfig.Name} 模型检测异常,{result?.ResultMessage}");
detectResult.IsMLDetectDone = false; detectResult.IsMLDetectDone = false;
} }
if (result != null && result.IsSuccess) if (result != null && result.IsSuccess)
@ -187,9 +220,13 @@ namespace DH.Devices.Vision
detectResult.DetectDetails = result.ResultDetails; detectResult.DetectDetails = result.ResultDetails;
if (detectResult.DetectDetails != null) if (detectResult.DetectDetails != null)
{ {
LogAsync(DateTime.Now, LogLevel.Information, $"CoreInx:{mlSet.GPUNo} 产品:{detectResult.Pid} {detectResult.DetectName} 模型检测总耗时:{mlWatch.ElapsedMilliseconds} ms {result.ResultMessage},{string.Join("", detectResult.DetectDetails.Select(u => $"{u.LabelName} X:{u.Rect.X} Y:{u.Rect.Y} Area:{u.Area.ToString("f2")} W:{u.Rect.Width} H:{u.Rect.Height}"))}");
} }
else else
{ {
LogAsync(DateTime.Now, LogLevel.Exception, $"CoreInx:{mlSet.GPUNo} 产品:{detectResult.Pid} {detectConfig.Name} 模型检测异常返回 null");
detectResult.IsMLDetectDone = false; detectResult.IsMLDetectDone = false;
} }
} }
@ -206,19 +243,14 @@ namespace DH.Devices.Vision
{ {
//当前检测项的 过滤条件 // 当前检测项的 过滤条件
//var conditionList = detectConfig.DetectionFilterList var conditionList = detectConfig.DetectionLableList
// .Where(u => u.IsEnabled && u.LabelName == d.LabelName) .Where(u=>u.LabelName == d.LabelName)
// .GroupBy(u => u.ResultState)
// .OrderBy(u => u.Key)
// .ToList();
//当前检测项的 过滤条件
var conditionList = detectConfig.DetectionFilterList
.Where(u => u.IsEnabled && u.LabelName == d.LabelName)
.GroupBy(u => u.ResultState) .GroupBy(u => u.ResultState)
.OrderBy(u => u.Key) .OrderBy(u => u.Key)
.ToList(); .ToList();
if (conditionList.Count == 0) if (conditionList.Count == 0)
{ {
@ -236,30 +268,22 @@ namespace DH.Devices.Vision
} }
foreach (IGrouping<ResultState, DetectionFilter> group in conditionList) //foreach (IGrouping<ResultState, DetectionFilter> group in conditionList)
{
//bool b = group.ToList().Any(f =>
//{ //{
// bool b = group.ToList().Any(f =>
// {
// return f.FilterOperation(d); // return f.FilterOperation(d);
//}); // });
//if (b) // if (b)
//{ // {
// d.FinalResult = group.Key; // d.FinalResult = group.Key;
// break; // break;
//} // }
if (group.Any(f => f.FilterOperation(d)))
{
d.FinalResult = group.Key;
break;
}
//else
//{
// d.FinalResult = d.InferenceResult = ResultState.OK;
//} //}
}
}); });
#endregion #endregion
#region 5.NG #region 5.NG
@ -280,6 +304,7 @@ namespace DH.Devices.Vision
#endregion #endregion
LogAsync(DateTime.Now, LogLevel.Information, $"{detectConfig.Name} 检测结果:{detectResult.ResultState.GetEnumDescription()}");
@ -395,18 +420,18 @@ namespace DH.Devices.Vision
// 根据算法类型创建不同的实例 // 根据算法类型创建不同的实例
switch (dc.ModelType) switch (dc.ModelType)
{ {
case MLModelType.ImageClassification: case ModelType.:
break; break;
case MLModelType.ObjectDetection: case ModelType.:
mLEngineSet.StationMLEngine = new SimboObjectDetection(); mLEngineSet.StationMLEngine = new SimboObjectDetection();
break; break;
case MLModelType.SemanticSegmentation: case ModelType.:
break; break;
case MLModelType.InstanceSegmentation: case ModelType.:
mLEngineSet.StationMLEngine = new SimboInstanceSegmentation(); mLEngineSet.StationMLEngine = new SimboInstanceSegmentation();
break; break;
case MLModelType.ObjectGPUDetection: case ModelType.GPU:
mLEngineSet.StationMLEngine = new SimboDetection(); mLEngineSet.StationMLEngine = new SimboDetection();
break; break;
default: default:
@ -430,12 +455,14 @@ namespace DH.Devices.Vision
{ {
// throw new ProcessException("异常:模型加载异常", null); // throw new ProcessException("异常:模型加载异常", null);
} }
//LogAsync(DateTime.Now, LogLevel.Information, $"模型加载成功是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}" + $" {dc.ModelType.GetEnumDescription()}:{dc.ModelPath}"); LogAsync(DateTime.Now, LogLevel.Information, $"模型加载成功是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}" + $" {dc.ModelType.GetEnumDescription()}:{dc.ModelPath}");
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
//throw new ProcessException($"异常是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}模型加载异常:{ex.GetExceptionMessage()}"); // LogAsync(DateTime.Now, LogLevel.Error, $"模型加载成功是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}" + $" {dc.ModelType.GetEnumDescription()}:{dc.ModelPath}");
throw new ProcessException($"异常是否GPU:{isGPU} CoreInx:{coreInx} - {dc.Name}模型加载异常:{ex.GetExceptionMessage()}");
} }
return mLEngineSet; return mLEngineSet;
} }
@ -519,7 +546,7 @@ namespace DH.Devices.Vision
if (!tool.RunProcedure(out string errorMsg, out _)) if (!tool.RunProcedure(out string errorMsg, out _))
{ {
// detectResult.PreTreatedFlag = false; // detectResult.PreTreatedFlag = false;
LogAsync(DateTime.Now, LogLevel.Exception, $"{detectConfig.Name}预处理异常,{errorMsg}");
detectResult.IsPreTreatDone = false; detectResult.IsPreTreatDone = false;
@ -534,12 +561,82 @@ namespace DH.Devices.Vision
// detectResult.IsPreTreatDone = detectResult.VisionImageSet.PreTreatedFlag = preTreatRet == 1; // detectResult.IsPreTreatDone = detectResult.VisionImageSet.PreTreatedFlag = preTreatRet == 1;
//detectResult.IsPreTreatDone = detectResult.VisionImageSet.PreTreatedFlag = true; //detectResult.IsPreTreatDone = detectResult.VisionImageSet.PreTreatedFlag = true;
// detectResult.VisionImageSet.PreTreatedTime = DateTime.Now; // detectResult.VisionImageSet.PreTreatedTime = DateTime.Now;
switch (preTreatRet)
{
case 0: // 预处理算法无异常
{
for (int i = 0; i < detectConfig.OUTPreTreatParams.Count; i++) for (int i = 0; i < detectConfig.OUTPreTreatParams.Count; i++)
{ {
var param = detectConfig.OUTPreTreatParams[i]; var param = detectConfig.OUTPreTreatParams[i];
tool.InputTupleDic[param.Name] = double.Parse(param.Value);
var Value = tool.GetResultTuple(param.Name);
// 显示结果
IndexedSpec specRCricularity = new()
{
Code = param.Name,
ActualValue = Value
};
detectResult.realSpecs.Add(specRCricularity);
} }
detectResult.IsPreTreatNG = false;
detectResult.IsPreTreatDone = true;
}
break;
case -111: // 检测结果为NG
{
/// detectResult.VisionImageSet.DetectionResultImage =
// tool.GetResultObject("OUTPUT_PreTreatedImage").ConvertHImageToBitmap();
for (int i = 0; i < detectConfig.OUTPreTreatParams.Count; i++)
{
var param = detectConfig.OUTPreTreatParams[i];
var Value = tool.GetResultTuple(param.Name);
// 显示结果
IndexedSpec specRCricularity = new()
{
Code = param.Name,
ActualValue = Value
};
detectResult.realSpecs.Add(specRCricularity);
}
// 结果为NG
detectResult.ResultState = ResultState.DetectNG;
detectResult.IsPreTreatNG = true;
detectResult.IsPreTreatDone = true;
break;
}
default:
case -999: // 算法异常
{
// 算法异常时,结果图
// detectResult.VisionImageSet.DetectionResultImage =
// tool.GetResultObject("OUTPUT_PreTreatedImage").ConvertHImageToBitmap();
for (int i = 0; i < detectConfig.OUTPreTreatParams.Count; i++)
{
var param = detectConfig.OUTPreTreatParams[i];
// 显示结果
IndexedSpec specRCricularity = new()
{
Code = param.Name,
ActualValue = -1,
};
detectResult.realSpecs.Add(specRCricularity);
}
// 结果保持TBD
detectResult.IsPreTreatDone = true;
break;
}
}
@ -571,7 +668,7 @@ namespace DH.Devices.Vision
} }
catch (Exception ex) catch (Exception ex)
{ {
LogAsync(DateTime.Now, LogLevel.Exception, $"{detectConfig.Name}预处理异常:{ex.GetExceptionMessage()}");
} }
finally finally
{ {
@ -582,6 +679,266 @@ namespace DH.Devices.Vision
} }
} }
public void PreTreated2(DetectionConfig detectConfig, DetectStationResult detectResult,Mat MhImage)
{
try
{
if (detectConfig.SizeTreatParamList != null && detectConfig.SizeTreatParamList.Count > 0)
{
foreach (var preTreat in detectConfig.SizeTreatParamList)
{
if (!string.IsNullOrWhiteSpace(preTreat.PrePath))
{
string toolKey = preTreat.PrePath;
if (!HalconToolDict.ContainsKey(toolKey))
{
LogAsync(DateTime.Now, LogLevel.Exception, $"{detectConfig.Name}未获取预处理{preTreat.PreName}算法");
return;
}
//Mean_Thre Deviation_Thre Mean_standard Deviation_standard
var tool = HalconToolDict[toolKey];
//tool.InputTupleDic["Mean_Thre"] = 123;
List<PreTreatParam> PreParams = new List<PreTreatParam>();
preoutparms(PreParams, preTreat.ResultShow);
for (int i = 0; i < PreParams.Count(); i++)
{
var param = PreParams[i];
if (param.Value.Contains(","))
{
string[] strings = param.Value.Split(",");
float[] array = strings.Select(s => float.Parse(s)).ToArray();
HTuple hTupleArray = new HTuple(array);
tool.InputTupleDic[param.Name] = hTupleArray;
}
else
{
tool.InputTupleDic[param.Name] = double.Parse(param.Value);// param.Value.ToInt();
}
IndexedSpec spec1 = new IndexedSpec();
switch (preTreat.PreType)
{
case SizeEnum.线线:
break;
case SizeEnum.线:
break;
case SizeEnum.:
break;
case SizeEnum.:
spec1.Code = $"in-{param.Name}";
spec1.ActualValue = double.Parse(param.Value);
break;
case SizeEnum.线:
break;
}
detectResult.realSpecs.Add(spec1);
}
//// 指定保存路径
//string filePath = @"D:\saved_image.jpg"; // 你可以根据需要更改路径和文件名
//// 使用WriteImage保存图像
//detectResult.VisionImageSet.HImage.WriteImage("jpeg", 0, filePath); // "jpeg" 表示图像格式0表示不使用压缩
HObject obj = OpenCVHelper.MatToHImage(MhImage);
HImage hImage = HalconHelper.ConvertHObjectToHImage(obj);
tool.InputImageDic["INPUT_Image"] = hImage;
if (!tool.RunProcedure(out string errorMsg, out _))
{
// detectResult.VisionImageSet.PreTreatedFlag = false;
LogAsync(DateTime.Now, LogLevel.Exception, $"{detectConfig.Name}预处理异常,{errorMsg}");
detectResult.IsPreTreatDone = false;
// HandleDetectDone(detectResult, detectConfig);
return;
}
var preTreatRet = tool.GetResultTuple("OUTPUT_Flag").I;
//double MatchScore = 1;
//MatchScore = tool.GetResultTuple("MatchScore");
detectResult.IsPreTreatDone = preTreatRet == 1;
// detectResult.IsPreTreatDone = detectResult.VisionImageSet.PreTreatedFlag = true;
// detectResult.VisionImageSet.PreTreatedTime = DateTime.Now;
//IndexedSpec spec1 = new IndexedSpec();
//spec1.Code = "score";
//spec1.ActualValue = MatchScore;
//detectResult.realSpecs.Add(spec1);
;
// 2023/10/16 新增预处理结果反馈如果预处理结果为NG直接返回
if (preTreatRet != 0)
{
detectResult.ResultState = ResultState.DetectNG;
detectResult.IsPreTreatNG = true;
// detectResult.VisionImageSet.DetectionResultImage = detectResult.VisionImageSet.MLImage.ConvertHImageToBitmap();
}
else
{
switch (preTreat.PreType)
{
case SizeEnum.线线:
isPreOutparams(ref detectResult, preTreat, tool, ref preTreatRet);
break;
case SizeEnum.线:
isPreOutparams(ref detectResult, preTreat, tool, ref preTreatRet);
break;
case SizeEnum.:
break;
case SizeEnum.:
{
isPreOutparams(ref detectResult, preTreat, tool, ref preTreatRet);
}
break;
case SizeEnum.线:
break;
}
}
}
}
}
}
catch (Exception ex)
{
LogAsync(DateTime.Now, LogLevel.Exception, $"{detectConfig.Name}尺寸预处理异常:{ex.GetExceptionMessage()}");
}
finally
{
//detectResult.VisionImageSet.HImage?.Dispose();
//detectResult.VisionImageSet.HImage = null;
}
}
public void isPreOutparams(ref DetectStationResult detectResult, SizeTreatParam preTreat, HDevEngineTool tool, ref int preTreatRet)
{
List<PreTreatParam> PreParams = new List<PreTreatParam>();
preoutparms(PreParams, preTreat.OutResultShow);
for (int i = 0; i < PreParams.Count; i++)
{
var param = PreParams[i];
double dParam = double.Parse(param.Value);
double heights = tool.GetResultTuple(param.Name).D;
switch (preTreat.PreType)
{
case SizeEnum.:
IndexedSpec spec2 = new IndexedSpec();
spec2.Code = $"out-{param.Name}";
spec2.ActualValue = Convert.ToDouble(param.Value);
detectResult.realSpecs.Add(spec2);
IndexedSpec spec1 = new IndexedSpec();
spec1.Code = $"actual-{param.Name}";
spec1.ActualValue = heights;
detectResult.realSpecs.Add(spec1);
break;
default: break;
}
if ((heights > dParam - preTreat.PrePix) && (heights < dParam + preTreat.PrePix))
{
}
else
{
preTreatRet = -1;
break;
}
}
if (preTreatRet != 0)
{
detectResult.ResultState = ResultState.DetectNG;
detectResult.IsPreTreatNG = true;
//detectResult.VisionImageSet.DetectionResultImage = detectResult.VisionImageSet.MLImage.ConvertHImageToBitmap();
}
else
{
// detectResult.VisionImageSet.DetectionResultImage = detectResult.VisionImageSet.MLImage.ConvertHImageToBitmap();
}
}
public void preoutparms(List<PreTreatParam> preTreatParams, string defectRows)
{
// 解析 ReslutShow 字符串,构建 PreTreatParam 列表
if (!string.IsNullOrEmpty(defectRows))
{
var keyValuePairs = defectRows.Split(';');
foreach (var pair in keyValuePairs)
{
var parts = pair.Split(':');
if (parts.Length == 2)
{
PreTreatParam param;
if (parts[1].Trim().Contains(","))
{
param = new PreTreatParam
{
Name = parts[0].Trim(), // 去除多余的空格
Value = parts[1].Trim() // 转换为 double失败则为0
};
}
else
{
double dvalue = double.TryParse(parts[1].Trim(), out double value) ? value : 0;
param = new PreTreatParam
{
Name = parts[0].Trim(), // 去除多余的空格
Value = dvalue.ToString() // 转换为 double失败则为0
};
}
preTreatParams.Add(param);
}
}
}
}
/// <summary> /// <summary>
/// 显示检测结果 /// 显示检测结果
@ -606,15 +963,15 @@ namespace DH.Devices.Vision
}); });
} }
//if (detectResult.realSpecs != null && detectResult.realSpecs?.Count > 0) if (detectResult.realSpecs != null && detectResult.realSpecs?.Count > 0)
//{ {
// detectResult.realSpecs.ForEach(d => detectResult.realSpecs.ForEach(d =>
// { {
// displayTxt += displayTxt +=
// $"{d.Code} :{d.ActualValue} \r\n"; $"{d.Code} :{d.ActualValue} \r\n";
// }); });
//} }
Bitmap resultMask=result.ToBitmap(); Bitmap resultMask =result.ToBitmap();
//if (detectResult.VisionImageSet.DetectionResultImage == null && detectResult.VisionImageSet.SizeResultImage == null) //if (detectResult.VisionImageSet.DetectionResultImage == null && detectResult.VisionImageSet.SizeResultImage == null)
//{ //{
// return; // return;
@ -648,13 +1005,13 @@ namespace DH.Devices.Vision
List<IShapeElement> detectionResultShapesClone = new List<IShapeElement>(detectionResultShapes); List<IShapeElement> detectionResultShapesClone = new List<IShapeElement>(detectionResultShapes);
DetectionDone(DetectionId, resultMask, detectionResultShapes); DetectionDone(DetectionId, resultMask, detectionResultShapes);
//detectResult.DetectionOriginImage = CopyBitmapWithLockBits(resultMask);
//SaveDetectResultImageAsync(detectResult); SaveDetectResultImageAsync(detectResult);
// SaveDetectResultCSVAsync(detectResult); // SaveDetectResultCSVAsync(detectResult);
} }
catch (Exception ex) catch (Exception ex)
{ {
// LogAsync(DateTime.Now, LogLevel.Exception, //LogAsync(DateTime.Now, LogLevel.Exception,
// $"{Name}显示{detectResult.DetectName}检测结果异常,{ex.GetExceptionMessage()}"); // $"{Name}显示{detectResult.DetectName}检测结果异常,{ex.GetExceptionMessage()}");
} }
finally finally
@ -664,6 +1021,343 @@ namespace DH.Devices.Vision
} }
}); });
} }
public static Bitmap CopyBitmapWithLockBits(Bitmap original)
{
Bitmap copy = new Bitmap(original.Width, original.Height, original.PixelFormat);
BitmapData originalData = original.LockBits(
new Rectangle(0, 0, original.Width, original.Height),
ImageLockMode.ReadOnly,
original.PixelFormat
);
BitmapData copyData = copy.LockBits(
new Rectangle(0, 0, copy.Width, copy.Height),
ImageLockMode.WriteOnly,
copy.PixelFormat
);
int bytesPerPixel = Image.GetPixelFormatSize(original.PixelFormat) / 8;
int byteCount = originalData.Stride * original.Height;
byte[] buffer = new byte[byteCount];
System.Runtime.InteropServices.Marshal.Copy(originalData.Scan0, buffer, 0, byteCount);
System.Runtime.InteropServices.Marshal.Copy(buffer, 0, copyData.Scan0, byteCount);
original.UnlockBits(originalData);
copy.UnlockBits(copyData);
return copy;
}
/// <summary>
///图片异步保存
/// </summary>
public void SaveDetectResultImageAsync1(DetectStationResult detectResult)
{
string format = detectResult.ImageFormat.ToString().ToLower();
if(detectResult.ImageSaveDirectory!=null)
{
if (!Directory.Exists(detectResult.ImageSaveDirectory))
{
} }
else
{
}
}else
{
return;
}
//根目录
string rootPath = Path.Combine(detectResult.ImageSaveDirectory,
DateTime.Now.ToString("yyyyMMdd"), detectResult.DetectName);
if (detectResult.ResultState != ResultState.OK)
{
// NG原图
if (detectResult.SaveNGOriginal && detectResult.DetectionOriginImage != null)
{
string prefix = Path.Combine(rootPath, "NGRawImages", detectResult.ResultLabel);
string fullname = Path.Combine(prefix, $"{detectResult.Pid}_NGRawImage_{detectResult.DetectName}_{detectResult.Id}.{format}");
SaveImageAsync(fullname, detectResult.DetectionOriginImage, detectResult.ImageFormat);
}
//NG结果图
if (detectResult.SaveOKDetect && detectResult.DetectionOriginImage != null)
{
// 没有预处理,则保存原始图+检测结果图
// if (detectResult.VisionImageSet.PreTreatedBitmap == null)
{
//string displayTxt = detectResult.ResultState.ToString() + "\r\n";
string displayTxt = "";
detectResult.DetectDetails.ForEach(d =>
{
displayTxt += $"{d.LabelName} score:{d.Score.ToString("f2")} area:{d.Area.ToString("f2")}\r\n";
});
if (detectResult.realSpecs != null && detectResult.realSpecs?.Count > 0)
{
detectResult.realSpecs.ForEach(d =>
{
displayTxt +=
$"{d.Code} score:{d.ActualValue} \r\n";
});
}
Bitmap resultMask = detectResult.DetectionOriginImage.CopyBitmap();
Bitmap preTreatedBitmap = detectResult.DetectionOriginImage.CopyBitmap();
//List<IShapeElement> detectionResultShapes = new List<IShapeElement>(detectResult.DetectionResultShapes);
//DetectResultDisplay resultDisplay = new DetectResultDisplay(detectResult, resultMask, displayTxt);
//detectionResultShapes.Add(resultDisplay);
Bitmap resultMap = GetResultImage(resultMask, detectResult.DetectionResultShapes);
// resultDisplay.Dispose();
//detectionResultShapes.Clear();
Bitmap detectionFitImage = StaticHelper.HConnectBitmap(preTreatedBitmap, resultMap);
string prefix = Path.Combine(rootPath, "NGFitImages", detectResult.ResultLabel);
Directory.CreateDirectory(prefix); // 自动创建所有缺失的目录
string fullname = Path.Combine(prefix, $"{detectResult.Pid}_NGFitImage_{detectResult.DetectName}_{detectResult.Id}.{format}");
// SaveImageAsync(fullname, detectionFitImage, detectResult.ImageFormat);
// 使用回调或 Task.ContinueWith 确保保存完成后再释放资源
//SaveImageAsync(fullname, detectionFitImage, detectResult.ImageFormat)
// .ContinueWith(t =>
// {
// resultMask?.Dispose();
// preTreatedBitmap?.Dispose();
// resultMap?.Dispose();
// detectionFitImage?.Dispose();
// }, TaskScheduler.Default);
resultMask?.Dispose();
preTreatedBitmap?.Dispose();
resultMap?.Dispose();
detectionFitImage?.Dispose();
}
}
}
else
{ // OK原图
if (detectResult.SaveOKOriginal && detectResult.DetectionOriginImage != null)
{
string prefix = Path.Combine(rootPath, "OKRawImages", detectResult.ResultLabel);
string fullname = Path.Combine(prefix, $"{detectResult.Pid}_OKRawImage_{detectResult.DetectName}_{detectResult.Id}.{format}");
SaveImageAsync(fullname, detectResult.DetectionOriginImage, detectResult.ImageFormat);
}
//ok结果图
if (detectResult.SaveOKDetect && detectResult.DetectionOriginImage != null)
{
// 没有预处理,则保存原始图+检测结果图
// if (detectResult.VisionImageSet.PreTreatedBitmap == null)
{
//string displayTxt = detectResult.ResultState.ToString() + "\r\n";
string displayTxt = "";
detectResult.DetectDetails.ForEach(d =>
{
displayTxt += $"{d.LabelName} score:{d.Score.ToString("f2")} area:{d.Area.ToString("f2")}\r\n";
});
if (detectResult.realSpecs != null && detectResult.realSpecs?.Count > 0)
{
detectResult.realSpecs.ForEach(d =>
{
displayTxt +=
$"{d.Code} score:{d.ActualValue} \r\n";
});
}
Bitmap resultMask = detectResult.DetectionOriginImage.CopyBitmap();
Bitmap preTreatedBitmap = detectResult.DetectionOriginImage.CopyBitmap();
List<IShapeElement> detectionResultShapes = new List<IShapeElement>(detectResult.DetectionResultShapes);
DetectResultDisplay resultDisplay = new DetectResultDisplay(detectResult, resultMask, displayTxt);
detectionResultShapes.Add(resultDisplay);
Bitmap resultMap = GetResultImage(resultMask, detectionResultShapes);
Bitmap detectionFitImage = StaticHelper.HConnectBitmap(preTreatedBitmap, resultMap);
string prefix = Path.Combine(rootPath, "OKFitImages", detectResult.ResultLabel);
string fullname = Path.Combine(prefix, $"{detectResult.Pid}_" +
$"OKFitImage_{detectResult.DetectName}_{detectResult.Id}.{format}");
SaveImageAsync(fullname, detectionFitImage, detectResult.ImageFormat);
//resultDisplay.Dispose();
//detectionResultShapes.Clear();
//resultMask?.Dispose();
//preTreatedBitmap?.Dispose();
//resultMap?.Dispose();
//detectionFitImage?.Dispose();
}
}
}
}
public virtual Bitmap GetResultImage(Bitmap baseImage, List<IShapeElement> eleList)
{
try
{
// 重新生成画布 避免 无法从带有索引像素格式的图像创建graphics对象
Bitmap image = new Bitmap(baseImage.Width, baseImage.Height);
using (Graphics g = Graphics.FromImage(image))
{
g.DrawImage(baseImage, 0, 0);
// 创建临时拷贝避免共享状态
// var tempElements = eleList.Select(e => e.Clone()).Cast<IShapeElement>().ToList();
eleList.ForEach(e =>
{
e.State = ElementState.Normal;
e.Draw(g);
});
}
return image;
}
catch (Exception ex)
{
LogAsync(DateTime.Now, LogLevel.Exception, $"获取叠加结果图片异常:{ex.GetExceptionMessage()}");
return null;
}
}
public void SaveDetectResultImageAsync(DetectStationResult detectResult)
{
if (detectResult.ImageSaveDirectory == null) return;
string format = detectResult.ImageFormat.ToString().ToLower();
string rootPath = Path.Combine(detectResult.ImageSaveDirectory,
DateTime.Now.ToString("yyyyMMdd"), detectResult.DetectName);
try
{
if (detectResult.ResultState != ResultState.OK)
{
SaveNGImages(detectResult, rootPath, format);
}
else
{
SaveOKImages(detectResult, rootPath, format);
}
}
catch (Exception ex)
{
// Logger.Error($"保存检测结果失败: {ex.Message}");
}
finally {
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
private void SaveNGImages(DetectStationResult result, string rootPath, string format)
{
// NG 原图
if (result.SaveNGOriginal && result.DetectionOriginImage != null)
{
string prefix = Path.Combine(rootPath, "NGRawImages", result.ResultLabel);
Directory.CreateDirectory(prefix);
string fullname = Path.Combine(prefix, $"{result.Pid}_NGRawImage_{result.DetectName}_{result.Id}.{format}");
SaveImageAsync(fullname, result.DetectionOriginImage, result.ImageFormat);
}
// NG 结果图
if (result.SaveOKDetect && result.DetectionOriginImage != null)
{
string displayTxt = BuildDisplayText(result);
using (Bitmap resultMask = result.DetectionOriginImage.CopyBitmap())
using (Bitmap preTreatedBitmap = result.DetectionOriginImage.CopyBitmap())
{
var detectionResultShapes = new List<IShapeElement>()
{
new DetectResultDisplay(result, resultMask, displayTxt)
};
using (Bitmap resultMap = GetResultImage(resultMask, detectionResultShapes))
using (Bitmap detectionFitImage = StaticHelper.HConnectBitmap(preTreatedBitmap, resultMap))
{
string prefix = Path.Combine(rootPath, "NGFitImages", result.ResultLabel);
Directory.CreateDirectory(prefix);
string fullname = Path.Combine(prefix, $"{result.Pid}_NGFitImage_{result.DetectName}_{result.Id}.{format}");
SaveImageAsync(fullname, detectionFitImage, result.ImageFormat);
}
}
}
}
private void SaveOKImages(DetectStationResult result, string rootPath, string format)
{
// OK 原图
if (result.SaveOKOriginal && result.DetectionOriginImage != null)
{
string prefix = Path.Combine(rootPath, "OKRawImages", result.ResultLabel);
Directory.CreateDirectory(prefix);
string fullname = Path.Combine(prefix, $"{result.Pid}_OKRawImage_{result.DetectName}_{result.Id}.{format}");
SaveImageAsync(fullname, result.DetectionOriginImage, result.ImageFormat);
}
// OK 结果图
if (result.SaveOKDetect && result.DetectionOriginImage != null)
{
string displayTxt = BuildDisplayText(result);
using (Bitmap resultMask = result.DetectionOriginImage.CopyBitmap())
using (Bitmap preTreatedBitmap = result.DetectionOriginImage.CopyBitmap())
{
var detectionResultShapes = new List<IShapeElement>()
{
new DetectResultDisplay(result, resultMask, displayTxt)
};
using (Bitmap resultMap = GetResultImage(resultMask, detectionResultShapes))
using (Bitmap detectionFitImage = StaticHelper.HConnectBitmap(preTreatedBitmap, resultMap))
{
string prefix = Path.Combine(rootPath, "OKFitImages", result.ResultLabel);
Directory.CreateDirectory(prefix);
string fullname = Path.Combine(prefix, $"{result.Pid}_OKFitImage_{result.DetectName}_{result.Id}.{format}");
SaveImageAsync(fullname, detectionFitImage, result.ImageFormat);
}
}
}
}
private string BuildDisplayText(DetectStationResult result)
{
StringBuilder sb = new StringBuilder();
result.DetectDetails.ForEach(d => sb.AppendLine($"{d.LabelName} score:{d.Score:f2} area:{d.Area:f2}"));
if (result.realSpecs?.Count > 0)
{
result.realSpecs.ForEach(d => sb.AppendLine($"{d.Code} score:{d.ActualValue}"));
}
return sb.ToString();
}
}
} }

View File

@ -1,5 +1,5 @@
using AntdUI; using AntdUI;
using DH.Commons.Base;
using DH.Commons.Enums; using DH.Commons.Enums;
using OpenCvSharp; using OpenCvSharp;
using System; using System;
@ -17,7 +17,7 @@ namespace DH.Devices.Vision
public Mat ColorLut { get; set; } public Mat ColorLut { get; set; }
public byte[] ColorMap { get; set; } public byte[] ColorMap { get; set; }
public MLModelType ModelType { get; set; } public ModelType ModelType { get; set; }
public IntPtr Model { get; set; } public IntPtr Model { get; set; }
@ -59,7 +59,7 @@ namespace DH.Devices.Vision
// "rect": [421, 823, 6, 8] // "rect": [421, 823, 6, 8]
// }] // }]
//} //}
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public List<Result> HYolo; public List<Result> HYolo;
public class Result public class Result
@ -67,12 +67,12 @@ namespace DH.Devices.Vision
public double fScore; public double fScore;
public int classId; public int classId;
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public string classname; public string classname;
//public double area; //public double area;
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public List<int> rect; public List<int> rect;
@ -82,7 +82,7 @@ namespace DH.Devices.Vision
} }
public class SegResult public class SegResult
{ {
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public List<Result> SegmentResult; public List<Result> SegmentResult;
public class Result public class Result
@ -90,12 +90,12 @@ namespace DH.Devices.Vision
public double fScore; public double fScore;
public int classId; public int classId;
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public string classname; public string classname;
public double area; public double area;
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public List<int> rect; public List<int> rect;

View File

@ -22,18 +22,18 @@ namespace DH.Devices.Vision
/// <summary> /// <summary>
/// 检测配置ID /// 检测配置ID
/// </summary> /// </summary>
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public string DetectionId { get; set; } public string DetectionId { get; set; }
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public string DetectionName { get; set; } public string DetectionName { get; set; }
/// <summary> /// <summary>
/// 深度学习模型 /// 深度学习模型
/// </summary> /// </summary>
#pragma warning disable CS8618 // 在退出构造函数时,不可为 null 的字段必须包含非 null 值。请考虑声明为可以为 null。
public SimboVisionMLBase StationMLEngine { get; set; } public SimboVisionMLBase StationMLEngine { get; set; }

View File

@ -1,19 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<BaseOutputPath>..\</BaseOutputPath>
<AppendTargetFrameworkToOutputPath>output</AppendTargetFrameworkToOutputPath>
<UseWindowsForms>true</UseWindowsForms>
<Platforms>AnyCPU;x64</Platforms>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\DH.Commons.Devies\DH.Commons.Devies.csproj" />
</ItemGroup>
</Project>

View File

@ -1,49 +0,0 @@
using DH.Commons.Enums;
using DH.Devices.Devices;
using System.ComponentModel;
using System.Drawing.Design;
using System.Text.Json.Serialization;
namespace DH.Process
{
public class ProcessConfigBase
{
[JsonPropertyName("station_code")]
public string StationCode { get; set; }
#region
[Category("设备配置")]
[Description("相机配置")]
[DisplayName("相机配置")]
[JsonPropertyName("camera_config_collection")]
//[TypeConverter(typeof(CollectionCountConvert))]
//[Editor(typeof(InitialConfigCollectionEditor<CameraInitialConfigBase>), typeof(UITypeEditor))]
public List<CameraBase> CameraConfigCollection { get; set; } = new List<CameraBase>();
[Category("设备配置")]
[Description("模型配置")]
[DisplayName("模型配置")]
[JsonPropertyName("detection_config_collection")]
//[TypeConverter(typeof(CollectionCountConvert))]
//[Editor(typeof(InitialConfigCollectionEditor<CameraInitialConfigBase>), typeof(UITypeEditor))]
public List<DetectionConfig> DetectionConfigCollection { get; set; } = new List<DetectionConfig>();
// [Category("设备配置")]
// [Description("PLC配置")]
// [DisplayName("PLC配置")]
// [TypeConverter(typeof(CollectionCountConvert))]
// [Editor(typeof(InitialConfigCollectionEditor<PLCInitialConfigBase>), typeof(UITypeEditor))]
// public List<IInitialConfig> PLCConfigCollection { get; set; } = new List<IInitialConfig>();
// [Category("设备配置")]
// [Description("其他设备配置")]
// [DisplayName("其他设备配置")]
// [TypeConverter(typeof(CollectionCountConvert))]
// [Editor(typeof(InitialConfigCollectionEditor<InitialConfigBase>), typeof(UITypeEditor))]
// public List<IInitialConfig> DeviceConfigs { get; set; } = new List<IInitialConfig>();
#endregion
}
}

879
DH.RBAC/AccountForm.Designer.cs generated Normal file
View File

@ -0,0 +1,879 @@
namespace DH.RBAC
{
partial class AccountForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AccountForm));
this.uiPanel1 = new Sunny.UI.UIPanel();
this.titlePanel = new System.Windows.Forms.Panel();
this.uiLabel15 = new Sunny.UI.UILabel();
this.btnClose = new Sunny.UI.UISymbolLabel();
this.panel1 = new System.Windows.Forms.Panel();
this.lblCurrentUser = new System.Windows.Forms.Label();
this.imageAvator = new System.Windows.Forms.PictureBox();
this.uiTabControl1 = new Sunny.UI.UITabControl();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.txtBirthday = new Sunny.UI.UIDatePicker();
this.btnSave = new Sunny.UI.UIButton();
this.txtSignature = new Sunny.UI.UITextBox();
this.lblSignature = new Sunny.UI.UILabel();
this.txtAddress = new Sunny.UI.UITextBox();
this.lblAddress = new Sunny.UI.UILabel();
this.txtTel = new Sunny.UI.UITextBox();
this.lblTel = new Sunny.UI.UILabel();
this.txtEmail = new Sunny.UI.UITextBox();
this.lblEmail = new Sunny.UI.UILabel();
this.lblBirthday = new Sunny.UI.UILabel();
this.rdFemale = new Sunny.UI.UIRadioButton();
this.rdMale = new Sunny.UI.UIRadioButton();
this.txtNickName = new Sunny.UI.UITextBox();
this.lblGender = new Sunny.UI.UILabel();
this.lblNickName = new Sunny.UI.UILabel();
this.txtName = new Sunny.UI.UITextBox();
this.lblName = new Sunny.UI.UILabel();
this.txtAccount = new Sunny.UI.UITextBox();
this.lblAccount = new Sunny.UI.UILabel();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.btnSelectAvator = new Sunny.UI.UIButton();
this.uiLabel10 = new Sunny.UI.UILabel();
this.tabPage3 = new System.Windows.Forms.TabPage();
this.btnReset = new Sunny.UI.UIButton();
this.btnChangePassword = new Sunny.UI.UIButton();
this.txtComfirmPassword = new Sunny.UI.UITextBox();
this.txtNewPassword = new Sunny.UI.UITextBox();
this.lblComfirmPassword = new Sunny.UI.UILabel();
this.lblNewPassword = new Sunny.UI.UILabel();
this.txtOldPassword = new Sunny.UI.UITextBox();
this.lblOldPassword = new Sunny.UI.UILabel();
this.uiLabel11 = new Sunny.UI.UILabel();
this.uiPanel1.SuspendLayout();
this.titlePanel.SuspendLayout();
this.panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.imageAvator)).BeginInit();
this.uiTabControl1.SuspendLayout();
this.tabPage1.SuspendLayout();
this.tabPage2.SuspendLayout();
this.tabPage3.SuspendLayout();
this.SuspendLayout();
//
// uiPanel1
//
this.uiPanel1.Controls.Add(this.titlePanel);
this.uiPanel1.Controls.Add(this.panel1);
this.uiPanel1.Controls.Add(this.uiTabControl1);
this.uiPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.uiPanel1.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(241)))), ((int)(((byte)(243)))));
this.uiPanel1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.uiPanel1.Location = new System.Drawing.Point(0, 0);
this.uiPanel1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.uiPanel1.MinimumSize = new System.Drawing.Size(1, 1);
this.uiPanel1.Name = "uiPanel1";
this.uiPanel1.RectColor = System.Drawing.Color.Silver;
this.uiPanel1.Size = new System.Drawing.Size(1031, 558);
this.uiPanel1.Style = Sunny.UI.UIStyle.Custom;
this.uiPanel1.StyleCustomMode = true;
this.uiPanel1.TabIndex = 6;
this.uiPanel1.Text = null;
this.uiPanel1.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
//
// titlePanel
//
this.titlePanel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.titlePanel.Controls.Add(this.uiLabel15);
this.titlePanel.Controls.Add(this.btnClose);
this.titlePanel.Location = new System.Drawing.Point(0, -1);
this.titlePanel.Name = "titlePanel";
this.titlePanel.Size = new System.Drawing.Size(1031, 43);
this.titlePanel.TabIndex = 7;
this.titlePanel.MouseDown += new System.Windows.Forms.MouseEventHandler(this.titlePanel_MouseDown);
this.titlePanel.MouseMove += new System.Windows.Forms.MouseEventHandler(this.titlePanel_MouseMove);
//
// uiLabel15
//
this.uiLabel15.Dock = System.Windows.Forms.DockStyle.Fill;
this.uiLabel15.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.uiLabel15.Location = new System.Drawing.Point(0, 0);
this.uiLabel15.Name = "uiLabel15";
this.uiLabel15.Size = new System.Drawing.Size(986, 43);
this.uiLabel15.Style = Sunny.UI.UIStyle.Custom;
this.uiLabel15.TabIndex = 1;
this.uiLabel15.Text = "用户账号管理";
this.uiLabel15.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.uiLabel15.MouseDown += new System.Windows.Forms.MouseEventHandler(this.titlePanel_MouseDown);
this.uiLabel15.MouseMove += new System.Windows.Forms.MouseEventHandler(this.titlePanel_MouseMove);
//
// btnClose
//
this.btnClose.Dock = System.Windows.Forms.DockStyle.Right;
this.btnClose.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.btnClose.Location = new System.Drawing.Point(986, 0);
this.btnClose.MinimumSize = new System.Drawing.Size(1, 1);
this.btnClose.Name = "btnClose";
this.btnClose.Padding = new System.Windows.Forms.Padding(64, 0, 0, 0);
this.btnClose.Size = new System.Drawing.Size(45, 43);
this.btnClose.Style = Sunny.UI.UIStyle.Custom;
this.btnClose.Symbol = 77;
this.btnClose.SymbolSize = 60;
this.btnClose.TabIndex = 0;
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
this.btnClose.MouseEnter += new System.EventHandler(this.btnClose_MouseEnter);
this.btnClose.MouseLeave += new System.EventHandler(this.btnClose_MouseLeave);
//
// panel1
//
this.panel1.BackColor = System.Drawing.Color.White;
this.panel1.Controls.Add(this.lblCurrentUser);
this.panel1.Controls.Add(this.imageAvator);
this.panel1.Location = new System.Drawing.Point(12, 56);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(241, 218);
this.panel1.TabIndex = 6;
//
// lblCurrentUser
//
this.lblCurrentUser.Location = new System.Drawing.Point(3, 176);
this.lblCurrentUser.Name = "lblCurrentUser";
this.lblCurrentUser.Size = new System.Drawing.Size(235, 27);
this.lblCurrentUser.TabIndex = 4;
this.lblCurrentUser.Text = "admin@管理员";
this.lblCurrentUser.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// imageAvator
//
this.imageAvator.Image = global:: DH.RBAC.Properties.Resources.avatar;
this.imageAvator.Location = new System.Drawing.Point(49, 27);
this.imageAvator.Name = "imageAvator";
this.imageAvator.Size = new System.Drawing.Size(139, 136);
this.imageAvator.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.imageAvator.TabIndex = 3;
this.imageAvator.TabStop = false;
//
// uiTabControl1
//
this.uiTabControl1.Controls.Add(this.tabPage1);
this.uiTabControl1.Controls.Add(this.tabPage2);
this.uiTabControl1.Controls.Add(this.tabPage3);
this.uiTabControl1.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed;
this.uiTabControl1.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.uiTabControl1.ItemSize = new System.Drawing.Size(150, 40);
this.uiTabControl1.Location = new System.Drawing.Point(275, 56);
this.uiTabControl1.MainPage = "";
this.uiTabControl1.MenuStyle = Sunny.UI.UIMenuStyle.Custom;
this.uiTabControl1.Name = "uiTabControl1";
this.uiTabControl1.SelectedIndex = 0;
this.uiTabControl1.Size = new System.Drawing.Size(734, 490);
this.uiTabControl1.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;
this.uiTabControl1.Style = Sunny.UI.UIStyle.Custom;
this.uiTabControl1.TabBackColor = System.Drawing.Color.White;
this.uiTabControl1.TabIndex = 5;
this.uiTabControl1.TabSelectedColor = System.Drawing.Color.White;
this.uiTabControl1.TabUnSelectedForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(73)))), ((int)(((byte)(82)))), ((int)(((byte)(91)))));
//
// tabPage1
//
this.tabPage1.BackColor = System.Drawing.Color.White;
this.tabPage1.Controls.Add(this.txtBirthday);
this.tabPage1.Controls.Add(this.btnSave);
this.tabPage1.Controls.Add(this.txtSignature);
this.tabPage1.Controls.Add(this.lblSignature);
this.tabPage1.Controls.Add(this.txtAddress);
this.tabPage1.Controls.Add(this.lblAddress);
this.tabPage1.Controls.Add(this.txtTel);
this.tabPage1.Controls.Add(this.lblTel);
this.tabPage1.Controls.Add(this.txtEmail);
this.tabPage1.Controls.Add(this.lblEmail);
this.tabPage1.Controls.Add(this.lblBirthday);
this.tabPage1.Controls.Add(this.rdFemale);
this.tabPage1.Controls.Add(this.rdMale);
this.tabPage1.Controls.Add(this.txtNickName);
this.tabPage1.Controls.Add(this.lblGender);
this.tabPage1.Controls.Add(this.lblNickName);
this.tabPage1.Controls.Add(this.txtName);
this.tabPage1.Controls.Add(this.lblName);
this.tabPage1.Controls.Add(this.txtAccount);
this.tabPage1.Controls.Add(this.lblAccount);
this.tabPage1.Location = new System.Drawing.Point(0, 40);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Size = new System.Drawing.Size(734, 450);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "资料";
//
// txtBirthday
//
this.txtBirthday.FillColor = System.Drawing.Color.White;
this.txtBirthday.FillColor2 = System.Drawing.Color.White;
this.txtBirthday.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.txtBirthday.Location = new System.Drawing.Point(117, 139);
this.txtBirthday.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.txtBirthday.MaxLength = 10;
this.txtBirthday.MinimumSize = new System.Drawing.Size(63, 0);
this.txtBirthday.Name = "txtBirthday";
this.txtBirthday.Padding = new System.Windows.Forms.Padding(0, 0, 30, 2);
this.txtBirthday.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtBirthday.Size = new System.Drawing.Size(188, 36);
this.txtBirthday.StyleCustomMode = true;
this.txtBirthday.SymbolDropDown = 61555;
this.txtBirthday.SymbolNormal = 61555;
this.txtBirthday.TabIndex = 20;
this.txtBirthday.Text = "2021-12-29";
this.txtBirthday.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
this.txtBirthday.Value = new System.DateTime(2021, 12, 29, 0, 0, 0, 0);
//
// btnSave
//
this.btnSave.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnSave.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.btnSave.Location = new System.Drawing.Point(117, 379);
this.btnSave.MinimumSize = new System.Drawing.Size(1, 1);
this.btnSave.Name = "btnSave";
this.btnSave.Size = new System.Drawing.Size(125, 44);
this.btnSave.Style = Sunny.UI.UIStyle.Custom;
this.btnSave.TabIndex = 19;
this.btnSave.Text = "保存";
this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
//
// txtSignature
//
this.txtSignature.ButtonFillColor = System.Drawing.Color.White;
this.txtSignature.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtSignature.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtSignature.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102)))));
this.txtSignature.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.txtSignature.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229)))));
this.txtSignature.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtSignature.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255)))));
this.txtSignature.ButtonSymbol = 61761;
this.txtSignature.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtSignature.FillColor2 = System.Drawing.Color.White;
this.txtSignature.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.txtSignature.Location = new System.Drawing.Point(117, 252);
this.txtSignature.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.txtSignature.Maximum = 2147483647D;
this.txtSignature.MaxLength = 128;
this.txtSignature.Minimum = -2147483648D;
this.txtSignature.MinimumSize = new System.Drawing.Size(1, 16);
this.txtSignature.Multiline = true;
this.txtSignature.Name = "txtSignature";
this.txtSignature.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtSignature.Size = new System.Drawing.Size(581, 103);
this.txtSignature.StyleCustomMode = true;
this.txtSignature.TabIndex = 18;
this.txtSignature.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
//
// lblSignature
//
this.lblSignature.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.lblSignature.Location = new System.Drawing.Point(3, 252);
this.lblSignature.Name = "lblSignature";
this.lblSignature.Size = new System.Drawing.Size(107, 29);
this.lblSignature.Style = Sunny.UI.UIStyle.Custom;
this.lblSignature.TabIndex = 17;
this.lblSignature.Text = "个性签名";
this.lblSignature.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// txtAddress
//
this.txtAddress.ButtonFillColor = System.Drawing.Color.White;
this.txtAddress.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtAddress.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtAddress.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102)))));
this.txtAddress.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.txtAddress.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229)))));
this.txtAddress.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtAddress.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255)))));
this.txtAddress.ButtonSymbol = 61761;
this.txtAddress.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtAddress.FillColor2 = System.Drawing.Color.White;
this.txtAddress.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.txtAddress.Location = new System.Drawing.Point(429, 191);
this.txtAddress.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.txtAddress.Maximum = 2147483647D;
this.txtAddress.MaxLength = 128;
this.txtAddress.Minimum = -2147483648D;
this.txtAddress.MinimumSize = new System.Drawing.Size(1, 16);
this.txtAddress.Name = "txtAddress";
this.txtAddress.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtAddress.Size = new System.Drawing.Size(269, 42);
this.txtAddress.StyleCustomMode = true;
this.txtAddress.TabIndex = 16;
this.txtAddress.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
//
// lblAddress
//
this.lblAddress.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.lblAddress.Location = new System.Drawing.Point(312, 198);
this.lblAddress.Name = "lblAddress";
this.lblAddress.Size = new System.Drawing.Size(110, 29);
this.lblAddress.Style = Sunny.UI.UIStyle.Custom;
this.lblAddress.TabIndex = 15;
this.lblAddress.Text = "联系地址";
this.lblAddress.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// txtTel
//
this.txtTel.ButtonFillColor = System.Drawing.Color.White;
this.txtTel.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtTel.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtTel.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102)))));
this.txtTel.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.txtTel.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229)))));
this.txtTel.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtTel.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255)))));
this.txtTel.ButtonSymbol = 61761;
this.txtTel.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtTel.FillColor2 = System.Drawing.Color.White;
this.txtTel.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.txtTel.Location = new System.Drawing.Point(117, 191);
this.txtTel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.txtTel.Maximum = 2147483647D;
this.txtTel.MaxLength = 20;
this.txtTel.Minimum = -2147483648D;
this.txtTel.MinimumSize = new System.Drawing.Size(1, 16);
this.txtTel.Name = "txtTel";
this.txtTel.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtTel.Size = new System.Drawing.Size(188, 42);
this.txtTel.StyleCustomMode = true;
this.txtTel.TabIndex = 14;
this.txtTel.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
//
// lblTel
//
this.lblTel.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.lblTel.Location = new System.Drawing.Point(3, 198);
this.lblTel.Name = "lblTel";
this.lblTel.Size = new System.Drawing.Size(107, 29);
this.lblTel.Style = Sunny.UI.UIStyle.Custom;
this.lblTel.TabIndex = 13;
this.lblTel.Text = "移动电话";
this.lblTel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// txtEmail
//
this.txtEmail.ButtonFillColor = System.Drawing.Color.White;
this.txtEmail.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtEmail.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtEmail.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102)))));
this.txtEmail.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.txtEmail.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229)))));
this.txtEmail.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtEmail.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255)))));
this.txtEmail.ButtonSymbol = 61761;
this.txtEmail.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtEmail.FillColor2 = System.Drawing.Color.White;
this.txtEmail.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.txtEmail.Location = new System.Drawing.Point(429, 136);
this.txtEmail.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.txtEmail.Maximum = 2147483647D;
this.txtEmail.MaxLength = 60;
this.txtEmail.Minimum = -2147483648D;
this.txtEmail.MinimumSize = new System.Drawing.Size(1, 16);
this.txtEmail.Name = "txtEmail";
this.txtEmail.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtEmail.Size = new System.Drawing.Size(269, 42);
this.txtEmail.StyleCustomMode = true;
this.txtEmail.TabIndex = 12;
this.txtEmail.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
//
// lblEmail
//
this.lblEmail.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.lblEmail.Location = new System.Drawing.Point(357, 143);
this.lblEmail.Name = "lblEmail";
this.lblEmail.Size = new System.Drawing.Size(65, 29);
this.lblEmail.Style = Sunny.UI.UIStyle.Custom;
this.lblEmail.TabIndex = 11;
this.lblEmail.Text = "邮箱";
this.lblEmail.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// lblBirthday
//
this.lblBirthday.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.lblBirthday.Location = new System.Drawing.Point(3, 143);
this.lblBirthday.Name = "lblBirthday";
this.lblBirthday.Size = new System.Drawing.Size(107, 29);
this.lblBirthday.Style = Sunny.UI.UIStyle.Custom;
this.lblBirthday.TabIndex = 9;
this.lblBirthday.Text = "出生日期";
this.lblBirthday.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// rdFemale
//
this.rdFemale.Cursor = System.Windows.Forms.Cursors.Hand;
this.rdFemale.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.rdFemale.Location = new System.Drawing.Point(501, 88);
this.rdFemale.MinimumSize = new System.Drawing.Size(1, 1);
this.rdFemale.Name = "rdFemale";
this.rdFemale.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0);
this.rdFemale.Size = new System.Drawing.Size(57, 36);
this.rdFemale.Style = Sunny.UI.UIStyle.Custom;
this.rdFemale.TabIndex = 8;
this.rdFemale.Text = "女";
//
// rdMale
//
this.rdMale.Checked = true;
this.rdMale.Cursor = System.Windows.Forms.Cursors.Hand;
this.rdMale.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.rdMale.Location = new System.Drawing.Point(433, 88);
this.rdMale.MinimumSize = new System.Drawing.Size(1, 1);
this.rdMale.Name = "rdMale";
this.rdMale.Padding = new System.Windows.Forms.Padding(22, 0, 0, 0);
this.rdMale.Size = new System.Drawing.Size(57, 36);
this.rdMale.Style = Sunny.UI.UIStyle.Custom;
this.rdMale.TabIndex = 7;
this.rdMale.Text = "男";
//
// txtNickName
//
this.txtNickName.ButtonFillColor = System.Drawing.Color.White;
this.txtNickName.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtNickName.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtNickName.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102)))));
this.txtNickName.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.txtNickName.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229)))));
this.txtNickName.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtNickName.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255)))));
this.txtNickName.ButtonSymbol = 61761;
this.txtNickName.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtNickName.FillColor2 = System.Drawing.Color.White;
this.txtNickName.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.txtNickName.Location = new System.Drawing.Point(429, 32);
this.txtNickName.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.txtNickName.Maximum = 2147483647D;
this.txtNickName.MaxLength = 20;
this.txtNickName.Minimum = -2147483648D;
this.txtNickName.MinimumSize = new System.Drawing.Size(1, 16);
this.txtNickName.Name = "txtNickName";
this.txtNickName.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtNickName.Size = new System.Drawing.Size(269, 42);
this.txtNickName.StyleCustomMode = true;
this.txtNickName.TabIndex = 3;
this.txtNickName.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
//
// lblGender
//
this.lblGender.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.lblGender.Location = new System.Drawing.Point(357, 91);
this.lblGender.Name = "lblGender";
this.lblGender.Size = new System.Drawing.Size(65, 29);
this.lblGender.Style = Sunny.UI.UIStyle.Custom;
this.lblGender.TabIndex = 6;
this.lblGender.Text = "性别";
this.lblGender.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// lblNickName
//
this.lblNickName.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.lblNickName.Location = new System.Drawing.Point(357, 39);
this.lblNickName.Name = "lblNickName";
this.lblNickName.Size = new System.Drawing.Size(65, 29);
this.lblNickName.Style = Sunny.UI.UIStyle.Custom;
this.lblNickName.TabIndex = 2;
this.lblNickName.Text = "昵称";
this.lblNickName.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// txtName
//
this.txtName.ButtonFillColor = System.Drawing.Color.White;
this.txtName.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtName.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtName.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102)))));
this.txtName.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.txtName.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229)))));
this.txtName.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtName.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255)))));
this.txtName.ButtonSymbol = 61761;
this.txtName.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtName.FillColor2 = System.Drawing.Color.White;
this.txtName.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.txtName.Location = new System.Drawing.Point(117, 84);
this.txtName.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.txtName.Maximum = 2147483647D;
this.txtName.MaxLength = 20;
this.txtName.Minimum = -2147483648D;
this.txtName.MinimumSize = new System.Drawing.Size(1, 16);
this.txtName.Name = "txtName";
this.txtName.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtName.Size = new System.Drawing.Size(188, 42);
this.txtName.StyleCustomMode = true;
this.txtName.TabIndex = 5;
this.txtName.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
//
// lblName
//
this.lblName.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.lblName.Location = new System.Drawing.Point(45, 91);
this.lblName.Name = "lblName";
this.lblName.Size = new System.Drawing.Size(65, 29);
this.lblName.Style = Sunny.UI.UIStyle.Custom;
this.lblName.TabIndex = 4;
this.lblName.Text = "姓名";
this.lblName.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// txtAccount
//
this.txtAccount.ButtonFillColor = System.Drawing.Color.White;
this.txtAccount.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtAccount.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtAccount.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102)))));
this.txtAccount.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.txtAccount.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229)))));
this.txtAccount.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtAccount.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255)))));
this.txtAccount.ButtonSymbol = 61761;
this.txtAccount.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtAccount.Enabled = false;
this.txtAccount.FillColor2 = System.Drawing.Color.White;
this.txtAccount.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.txtAccount.Location = new System.Drawing.Point(117, 32);
this.txtAccount.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.txtAccount.Maximum = 2147483647D;
this.txtAccount.MaxLength = 20;
this.txtAccount.Minimum = -2147483648D;
this.txtAccount.MinimumSize = new System.Drawing.Size(1, 16);
this.txtAccount.Name = "txtAccount";
this.txtAccount.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtAccount.Size = new System.Drawing.Size(188, 42);
this.txtAccount.StyleCustomMode = true;
this.txtAccount.TabIndex = 1;
this.txtAccount.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
//
// lblAccount
//
this.lblAccount.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.lblAccount.Location = new System.Drawing.Point(45, 39);
this.lblAccount.Name = "lblAccount";
this.lblAccount.Size = new System.Drawing.Size(65, 29);
this.lblAccount.Style = Sunny.UI.UIStyle.Custom;
this.lblAccount.TabIndex = 0;
this.lblAccount.Text = "账号";
this.lblAccount.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// tabPage2
//
this.tabPage2.BackColor = System.Drawing.Color.White;
this.tabPage2.Controls.Add(this.btnSelectAvator);
this.tabPage2.Controls.Add(this.uiLabel10);
this.tabPage2.Location = new System.Drawing.Point(0, 40);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Size = new System.Drawing.Size(200, 60);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "头像";
//
// btnSelectAvator
//
this.btnSelectAvator.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnSelectAvator.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.btnSelectAvator.Location = new System.Drawing.Point(258, 127);
this.btnSelectAvator.MinimumSize = new System.Drawing.Size(1, 1);
this.btnSelectAvator.Name = "btnSelectAvator";
this.btnSelectAvator.Size = new System.Drawing.Size(137, 48);
this.btnSelectAvator.Style = Sunny.UI.UIStyle.Custom;
this.btnSelectAvator.TabIndex = 1;
this.btnSelectAvator.Text = "上传头像";
this.btnSelectAvator.Click += new System.EventHandler(this.btnSelectAvator_Click);
//
// uiLabel10
//
this.uiLabel10.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.uiLabel10.Location = new System.Drawing.Point(111, 47);
this.uiLabel10.Name = "uiLabel10";
this.uiLabel10.Size = new System.Drawing.Size(538, 29);
this.uiLabel10.Style = Sunny.UI.UIStyle.Custom;
this.uiLabel10.TabIndex = 0;
this.uiLabel10.Text = "建议尺寸168*168支持jpg,bmp,png,不能超过200kb";
this.uiLabel10.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// tabPage3
//
this.tabPage3.BackColor = System.Drawing.Color.White;
this.tabPage3.Controls.Add(this.btnReset);
this.tabPage3.Controls.Add(this.btnChangePassword);
this.tabPage3.Controls.Add(this.txtComfirmPassword);
this.tabPage3.Controls.Add(this.txtNewPassword);
this.tabPage3.Controls.Add(this.lblComfirmPassword);
this.tabPage3.Controls.Add(this.lblNewPassword);
this.tabPage3.Controls.Add(this.txtOldPassword);
this.tabPage3.Controls.Add(this.lblOldPassword);
this.tabPage3.Controls.Add(this.uiLabel11);
this.tabPage3.Location = new System.Drawing.Point(0, 40);
this.tabPage3.Name = "tabPage3";
this.tabPage3.Size = new System.Drawing.Size(200, 60);
this.tabPage3.TabIndex = 2;
this.tabPage3.Text = "账号";
//
// btnReset
//
this.btnReset.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnReset.FillColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40)))));
this.btnReset.FillColor2 = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40)))));
this.btnReset.FillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86)))));
this.btnReset.FillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43)))));
this.btnReset.FillSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43)))));
this.btnReset.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.btnReset.Location = new System.Drawing.Point(268, 261);
this.btnReset.MinimumSize = new System.Drawing.Size(1, 1);
this.btnReset.Name = "btnReset";
this.btnReset.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(220)))), ((int)(((byte)(155)))), ((int)(((byte)(40)))));
this.btnReset.RectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(223)))), ((int)(((byte)(174)))), ((int)(((byte)(86)))));
this.btnReset.RectPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43)))));
this.btnReset.RectSelectedColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(137)))), ((int)(((byte)(43)))));
this.btnReset.Size = new System.Drawing.Size(125, 44);
this.btnReset.Style = Sunny.UI.UIStyle.Orange;
this.btnReset.StyleCustomMode = true;
this.btnReset.TabIndex = 21;
this.btnReset.Text = "重置";
this.btnReset.Click += new System.EventHandler(this.btnReset_Click);
//
// btnChangePassword
//
this.btnChangePassword.Cursor = System.Windows.Forms.Cursors.Hand;
this.btnChangePassword.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.btnChangePassword.Location = new System.Drawing.Point(114, 261);
this.btnChangePassword.MinimumSize = new System.Drawing.Size(1, 1);
this.btnChangePassword.Name = "btnChangePassword";
this.btnChangePassword.Size = new System.Drawing.Size(125, 44);
this.btnChangePassword.Style = Sunny.UI.UIStyle.Custom;
this.btnChangePassword.TabIndex = 20;
this.btnChangePassword.Text = "保存";
this.btnChangePassword.Click += new System.EventHandler(this.btnChangePassword_Click);
//
// txtComfirmPassword
//
this.txtComfirmPassword.ButtonFillColor = System.Drawing.Color.White;
this.txtComfirmPassword.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtComfirmPassword.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtComfirmPassword.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102)))));
this.txtComfirmPassword.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.txtComfirmPassword.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229)))));
this.txtComfirmPassword.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtComfirmPassword.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255)))));
this.txtComfirmPassword.ButtonSymbol = 61761;
this.txtComfirmPassword.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtComfirmPassword.FillColor2 = System.Drawing.Color.White;
this.txtComfirmPassword.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.txtComfirmPassword.Location = new System.Drawing.Point(205, 178);
this.txtComfirmPassword.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.txtComfirmPassword.Maximum = 2147483647D;
this.txtComfirmPassword.Minimum = -2147483648D;
this.txtComfirmPassword.MinimumSize = new System.Drawing.Size(1, 16);
this.txtComfirmPassword.Name = "txtComfirmPassword";
this.txtComfirmPassword.PasswordChar = '*';
this.txtComfirmPassword.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtComfirmPassword.Size = new System.Drawing.Size(188, 42);
this.txtComfirmPassword.StyleCustomMode = true;
this.txtComfirmPassword.TabIndex = 11;
this.txtComfirmPassword.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
//
// txtNewPassword
//
this.txtNewPassword.ButtonFillColor = System.Drawing.Color.White;
this.txtNewPassword.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtNewPassword.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtNewPassword.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102)))));
this.txtNewPassword.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.txtNewPassword.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229)))));
this.txtNewPassword.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtNewPassword.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255)))));
this.txtNewPassword.ButtonSymbol = 61761;
this.txtNewPassword.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtNewPassword.FillColor2 = System.Drawing.Color.White;
this.txtNewPassword.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.txtNewPassword.Location = new System.Drawing.Point(205, 123);
this.txtNewPassword.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.txtNewPassword.Maximum = 2147483647D;
this.txtNewPassword.Minimum = -2147483648D;
this.txtNewPassword.MinimumSize = new System.Drawing.Size(1, 16);
this.txtNewPassword.Name = "txtNewPassword";
this.txtNewPassword.PasswordChar = '*';
this.txtNewPassword.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtNewPassword.Size = new System.Drawing.Size(188, 42);
this.txtNewPassword.StyleCustomMode = true;
this.txtNewPassword.TabIndex = 9;
this.txtNewPassword.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
//
// lblComfirmPassword
//
this.lblComfirmPassword.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.lblComfirmPassword.Location = new System.Drawing.Point(88, 185);
this.lblComfirmPassword.Name = "lblComfirmPassword";
this.lblComfirmPassword.Size = new System.Drawing.Size(110, 29);
this.lblComfirmPassword.Style = Sunny.UI.UIStyle.Custom;
this.lblComfirmPassword.TabIndex = 10;
this.lblComfirmPassword.Text = "确认密码";
this.lblComfirmPassword.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// lblNewPassword
//
this.lblNewPassword.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.lblNewPassword.Location = new System.Drawing.Point(114, 130);
this.lblNewPassword.Name = "lblNewPassword";
this.lblNewPassword.Size = new System.Drawing.Size(84, 29);
this.lblNewPassword.Style = Sunny.UI.UIStyle.Custom;
this.lblNewPassword.TabIndex = 8;
this.lblNewPassword.Text = "新密码";
this.lblNewPassword.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// txtOldPassword
//
this.txtOldPassword.ButtonFillColor = System.Drawing.Color.White;
this.txtOldPassword.ButtonFillHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtOldPassword.ButtonFillPressColor = System.Drawing.Color.FromArgb(((int)(((byte)(235)))), ((int)(((byte)(243)))), ((int)(((byte)(255)))));
this.txtOldPassword.ButtonForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(96)))), ((int)(((byte)(98)))), ((int)(((byte)(102)))));
this.txtOldPassword.ButtonForeHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(80)))), ((int)(((byte)(160)))), ((int)(((byte)(255)))));
this.txtOldPassword.ButtonForePressColor = System.Drawing.Color.FromArgb(((int)(((byte)(74)))), ((int)(((byte)(131)))), ((int)(((byte)(229)))));
this.txtOldPassword.ButtonRectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtOldPassword.ButtonRectHoverColor = System.Drawing.Color.FromArgb(((int)(((byte)(197)))), ((int)(((byte)(222)))), ((int)(((byte)(255)))));
this.txtOldPassword.ButtonSymbol = 61761;
this.txtOldPassword.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtOldPassword.FillColor2 = System.Drawing.Color.White;
this.txtOldPassword.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.txtOldPassword.Location = new System.Drawing.Point(205, 71);
this.txtOldPassword.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.txtOldPassword.Maximum = 2147483647D;
this.txtOldPassword.Minimum = -2147483648D;
this.txtOldPassword.MinimumSize = new System.Drawing.Size(1, 16);
this.txtOldPassword.Name = "txtOldPassword";
this.txtOldPassword.PasswordChar = '*';
this.txtOldPassword.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(216)))), ((int)(((byte)(219)))), ((int)(((byte)(227)))));
this.txtOldPassword.Size = new System.Drawing.Size(188, 42);
this.txtOldPassword.StyleCustomMode = true;
this.txtOldPassword.TabIndex = 7;
this.txtOldPassword.TextAlignment = System.Drawing.ContentAlignment.MiddleLeft;
//
// lblOldPassword
//
this.lblOldPassword.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.lblOldPassword.Location = new System.Drawing.Point(114, 78);
this.lblOldPassword.Name = "lblOldPassword";
this.lblOldPassword.Size = new System.Drawing.Size(84, 29);
this.lblOldPassword.Style = Sunny.UI.UIStyle.Custom;
this.lblOldPassword.TabIndex = 6;
this.lblOldPassword.Text = "旧密码";
this.lblOldPassword.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// uiLabel11
//
this.uiLabel11.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.uiLabel11.Location = new System.Drawing.Point(45, 23);
this.uiLabel11.Name = "uiLabel11";
this.uiLabel11.Size = new System.Drawing.Size(125, 29);
this.uiLabel11.Style = Sunny.UI.UIStyle.Custom;
this.uiLabel11.TabIndex = 0;
this.uiLabel11.Text = "修改密码";
this.uiLabel11.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// AccountForm
//
this.AllowShowTitle = false;
this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 27F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1031, 558);
this.Controls.Add(this.uiPanel1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "AccountForm";
this.Padding = new System.Windows.Forms.Padding(0);
this.RectColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(248)))));
this.ShowTitle = false;
this.ShowTitleIcon = true;
this.Style = Sunny.UI.UIStyle.Custom;
this.Text = "账户管理";
this.TitleColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(248)))), ((int)(((byte)(248)))));
this.TitleForeColor = System.Drawing.Color.DimGray;
this.TopMost = true;
this.Load += new System.EventHandler(this.AccountForm_Load);
this.uiPanel1.ResumeLayout(false);
this.titlePanel.ResumeLayout(false);
this.panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.imageAvator)).EndInit();
this.uiTabControl1.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.tabPage2.ResumeLayout(false);
this.tabPage3.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private Sunny.UI.UIPanel uiPanel1;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Label lblCurrentUser;
private System.Windows.Forms.PictureBox imageAvator;
private Sunny.UI.UITabControl uiTabControl1;
private System.Windows.Forms.TabPage tabPage1;
private Sunny.UI.UIButton btnSave;
private Sunny.UI.UITextBox txtSignature;
private Sunny.UI.UILabel lblSignature;
private Sunny.UI.UITextBox txtAddress;
private Sunny.UI.UILabel lblAddress;
private Sunny.UI.UITextBox txtTel;
private Sunny.UI.UILabel lblTel;
private Sunny.UI.UITextBox txtEmail;
private Sunny.UI.UILabel lblEmail;
private Sunny.UI.UILabel lblBirthday;
private Sunny.UI.UIRadioButton rdFemale;
private Sunny.UI.UIRadioButton rdMale;
private Sunny.UI.UILabel lblGender;
private Sunny.UI.UILabel lblNickName;
private Sunny.UI.UITextBox txtName;
private Sunny.UI.UILabel lblName;
private Sunny.UI.UITextBox txtAccount;
private Sunny.UI.UILabel lblAccount;
private System.Windows.Forms.TabPage tabPage2;
private Sunny.UI.UIButton btnSelectAvator;
private Sunny.UI.UILabel uiLabel10;
private System.Windows.Forms.TabPage tabPage3;
private Sunny.UI.UIButton btnReset;
private Sunny.UI.UIButton btnChangePassword;
private Sunny.UI.UITextBox txtComfirmPassword;
private Sunny.UI.UITextBox txtNewPassword;
private Sunny.UI.UILabel lblComfirmPassword;
private Sunny.UI.UILabel lblNewPassword;
private Sunny.UI.UITextBox txtOldPassword;
private Sunny.UI.UILabel lblOldPassword;
private Sunny.UI.UILabel uiLabel11;
private System.Windows.Forms.Panel titlePanel;
private Sunny.UI.UILabel uiLabel15;
private Sunny.UI.UISymbolLabel btnClose;
private Sunny.UI.UITextBox txtNickName;
private Sunny.UI.UIDatePicker txtBirthday;
}
}

304
DH.RBAC/AccountForm.cs Normal file
View File

@ -0,0 +1,304 @@
using Sunny.UI;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using DH.RBAC.Model.Sys;
using DH.RBAC.Common;
using DH.RBAC.Properties;
using DH.RBAC.Logic.Sys;
using DH.RBAC.Utility.Other;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace DH.RBAC
{
/// <summary>
/// 用户账户界面
/// </summary>
public partial class AccountForm : UIForm
{
private SysUserLogic userlogic;
private SysUserLogOnLogic userLogOnLogic;
/// <summary>
/// 构造方法
/// </summary>
public AccountForm()
{
InitializeComponent();
userlogic = new SysUserLogic();
userLogOnLogic = new SysUserLogOnLogic();
}
#region
private void btnClose_Click(object sender, EventArgs e)
{
FormHelper.subForm = null;
this.Close();
}
private Point mPoint;
private void titlePanel_MouseDown(object sender, MouseEventArgs e)
{
mPoint = new Point(e.X, e.Y);
}
private void titlePanel_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.Location = new Point(this.Location.X + e.X - mPoint.X, this.Location.Y + e.Y - mPoint.Y);
}
}
private void btnClose_MouseEnter(object sender, EventArgs e)
{
btnClose.BackColor = Color.FromArgb(231, 231, 231);
}
private void btnClose_MouseLeave(object sender, EventArgs e)
{
btnClose.BackColor = Color.Transparent;
}
#endregion
private string Avatar;
/// <summary>
/// 画面加载,读取用户信息,显示在界面上
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AccountForm_Load(object sender, EventArgs e)
{
SysUser user = userlogic.Get(GlobalConfig.CurrentUser.Id);
if (user == null)
{
AntdUI.Message.warn(this, "网络或服务器异常,请稍后重试!", autoClose: 3);
return;
}
Avatar = user.Avatar;
txtAccount.Text = user.Account;
txtNickName.Text = user.NickName;
txtName.Text = user.RealName;
if (user.Gender == "1")
rdMale.Checked = true;
else
rdFemale.Checked = true;
txtBirthday.Value = user.Birthday.Value;
txtEmail.Text = user.Email;
txtTel.Text = user.MobilePhone;
txtAddress.Text = user.Address;
txtSignature.Text = user.Signature;
//头像显示
if (StringHelper.IsNullOrEmpty(user.AvatarBase64))
{
imageAvator.Image = Resources.avatar;
}
else
{
try
{
MemoryStream ms = new MemoryStream(Convert.FromBase64String(user.AvatarBase64));
imageAvator.Image = Image.FromStream(ms);
}
catch
{
imageAvator.Image = Resources.avatar;
}
}
lblCurrentUser.Text = $"{user.Account}@{user.NickName}";
}
/// <summary>
/// 保存修改
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSave_Click(object sender, EventArgs e)
{
//非空检测
if (StringHelper.IsNullOrEmpty(txtNickName.Text))
{
AntdUI.Message.warn(this, "昵称不能为空!", autoClose: 3);
return;
}
if (StringHelper.IsNullOrEmpty(txtName.Text))
{
AntdUI.Message.warn(this, "姓名不能为空!", autoClose: 3);
return;
}
if (StringHelper.IsNullOrEmpty(txtBirthday.Text))
{
AntdUI.Message.warn(this, "请选择生日!", autoClose: 3);
return;
}
if (StringHelper.IsNullOrEmpty(txtEmail.Text))
{
AntdUI.Message.warn(this, "邮箱不能为空!", autoClose: 3);
return;
}
if (StringHelper.IsNullOrEmpty(txtTel.Text))
{
AntdUI.Message.warn(this, "手机不能为空!", autoClose: 3);
return;
}
//获得目前信息,提交给服务端处理,返回结果
SysUser model = new SysUser();
model.Id = GlobalConfig.CurrentUser.Id;
model.Account = txtAccount.Text;
model.NickName = txtNickName.Text;
model.RealName = txtName.Text;
model.Avatar = Avatar;
model.Gender = rdMale.Checked ? "1" : "0";
model.StrBirthday = txtBirthday.Text;
model.Email = txtEmail.Text;
model.MobilePhone = txtTel.Text;
model.Address = txtAddress.Text;
model.Signature = txtSignature.Text;
DateTime defaultDt = DateTime.Today;
DateTime.TryParse(model.StrBirthday, out defaultDt);
model.Birthday = defaultDt;
int row = userlogic.AppUpdateBasicInfo(model);
if (row == 0)
{
AntdUI.Message.warn(this, "对不起,操作失败!", autoClose: 3);
return;
}
AntdUI.Message.success(this, "恭喜你,操作成功!", autoClose: 3);
}
/// <summary>
/// 选择图片上传
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSelectAvator_Click(object sender, EventArgs e)
{
//OpenFileDialog dialog = new OpenFileDialog();
//dialog.Filter = "Image Files(*.BMP;*.JPG;*.png)|*.BMP;*.JPG;*.png";
//if (dialog.ShowDialog() == DialogResult.OK)
//{
// string fileName = dialog.FileName;
// Image image = Image.FromFile(fileName);
// //上传到服务器
// AjaxResult result = null;
// string url = GlobalConfig.Config.Url + "account/uploadImage";
// string str = HttpUtils.PostFile(url, fileName, 2000);
// try
// {
// result = str.ToObject<AjaxResult>();
// }
// catch
// {
// result = null;
// }
// if (result == null)
// {
// this.ShowWarningDialog("网络或服务器异常,请稍后重试", UIStyle.White);
// return;
// }
// if (result.state != ResultType.Success)
// {
// this.ShowWarningDialog(result.message, UIStyle.White);
// return;
// }
// //上传成功,修改界面头像,以及服务器头像地址
// Avatar = result.data.ToString();
// imageAvator.Image = image;
// this.ShowSuccessDialog("上传成功,点击保存后生效", UIStyle.White);
//}
}
private void btnReset_Click(object sender, EventArgs e)
{
txtOldPassword.Text = string.Empty;
txtNewPassword.Text = string.Empty;
txtComfirmPassword.Text = string.Empty;
}
private void btnChangePassword_Click(object sender, EventArgs e)
{
//非空检测
if (StringHelper.IsNullOrEmpty(txtOldPassword.Text))
{
AntdUI.Message.warn(this, "旧密码不能为空!", autoClose: 3);
return;
}
if (StringHelper.IsNullOrEmpty(txtNewPassword.Text))
{
AntdUI.Message.warn(this, "新密码不能为空!", autoClose: 3);
return;
}
if (StringHelper.IsNullOrEmpty(txtComfirmPassword.Text))
{
AntdUI.Message.warn(this, "确认密码不能为空!", autoClose: 3);
return;
}
if (txtNewPassword.Text != txtComfirmPassword.Text)
{
AntdUI.Message.warn(this, "两次密码不一致!", autoClose: 3);
return;
}
Dictionary<string, string> parm = new Dictionary<string, string>();
string userId = GlobalConfig.CurrentUser.Id;
string oldPassword = txtOldPassword.Text;
string newPassword = txtNewPassword.Text;
string confirmPassword = txtComfirmPassword.Text;
if (!newPassword.Equals(confirmPassword))
{
AntdUI.Message.warn(this, "两次密码输入不一致,请重新确认!", autoClose: 3);
return;
}
oldPassword = oldPassword.MD5Encrypt();
newPassword = newPassword.MD5Encrypt();
confirmPassword = confirmPassword.MD5Encrypt();
var userLoginEntity = userLogOnLogic.GetByAccount(userId);
if (oldPassword.DESEncrypt(userLoginEntity.SecretKey).MD5Encrypt() != userLoginEntity.Password)
{
AntdUI.Message.warn(this, "旧密码验证失败!", autoClose: 3);
return;
}
userLoginEntity.Password = newPassword.DESEncrypt(userLoginEntity.SecretKey).MD5Encrypt();
int isSuccess = userLogOnLogic.ModifyPwd(userLoginEntity);
if (isSuccess == 0)
{
AntdUI.Message.warn(this, "对不起,操作失败!", autoClose: 3);
return;
}
AntdUI.Message.success(this, "修改成功!", autoClose: 3);
}
}
}

1161
DH.RBAC/AccountForm.resx Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,35 @@
using System.Collections.Generic;
using System.Drawing;
using DH.RBAC.Model.Sys;
namespace DH.RBAC.Common
{
/// <summary>
/// 全局数据存放
/// </summary>
public class GlobalConfig
{
public static MyConfig Config { get; set; }
/// <summary>
/// 当前登录的用户
/// </summary>
public static SysUser CurrentUser;
/// <summary>
/// 当前用户头像
/// </summary>
public static Image Avatar;
/// <summary>
/// 当前选的哪个菜单
/// </summary>
public static string CurrentMenuText;
/// <summary>
/// 当前用户权限
/// </summary>
public static List<SysPermission> PermissionList;
}
}

719
DH.RBAC/Common/IconDict.cs Normal file
View File

@ -0,0 +1,719 @@
using System.Collections.Generic;
namespace DH.RBAC.Common
{
/// <summary>
/// 图标字典
/// </summary>
public class IconDict
{
/// <summary>
/// 全局存放图标字典
/// </summary>
public static Dictionary<string, int> MyIconDict = Init();
/// <summary>
/// 初始化字典
/// </summary>
/// <returns></returns>
private static Dictionary<string, int> Init()
{
Dictionary<string, int> dict = new Dictionary<string, int>();
dict.Add("fa fa-bluetooth", 62099);
dict.Add("fa fa-bluetooth-b", 62100);
dict.Add("fa fa-codiepie", 62084);
dict.Add("fa fa-credit-card-alt", 62083);
dict.Add("fa fa-edge", 62082);
dict.Add("fa fa-fort-awesome", 62086);
dict.Add("fa fa-hashtag", 62098);
dict.Add("fa fa-mixcloud", 62089);
dict.Add("fa fa-modx", 62085);
dict.Add("fa fa-pause-circle", 62091);
dict.Add("fa fa-pause-circle-o", 62092);
dict.Add("fa fa-percent", 62101);
dict.Add("fa fa-product-hunt", 62088);
dict.Add("fa fa-reddit-alien", 62081);
dict.Add("fa fa-scribd", 62090);
dict.Add("fa fa-shopping-bag", 62096);
dict.Add("fa fa-shopping-basket", 62097);
dict.Add("fa fa-stop-circle", 62093);
dict.Add("fa fa-stop-circle-o", 62094);
dict.Add("fa fa-usb", 62087);
dict.Add("fa fa-adjust", 61506);
dict.Add("fa fa-anchor", 61757);
dict.Add("fa fa-archive", 61831);
dict.Add("fa fa-area-chart", 61950);
dict.Add("fa fa-arrows", 61511);
dict.Add("fa fa-arrows-h", 61566);
dict.Add("fa fa-arrows-v", 61565);
dict.Add("fa fa-asterisk", 61545);
dict.Add("fa fa-at", 61946);
dict.Add("fa fa-automobile", 61881);
dict.Add("fa fa-balance-scale", 62030);
dict.Add("fa fa-ban", 61534);
dict.Add("fa fa-bank", 61852);
dict.Add("fa fa-bar-chart", 61568);
dict.Add("fa fa-bar-chart-o", 61568);
dict.Add("fa fa-barcode", 61482);
dict.Add("fa fa-bars", 61641);
dict.Add("fa fa-battery-0", 62020);
dict.Add("fa fa-battery-1", 62019);
dict.Add("fa fa-battery-2", 62018);
dict.Add("fa fa-battery-3", 62017);
dict.Add("fa fa-battery-4", 62016);
dict.Add("fa fa-battery-empty", 62020);
dict.Add("fa fa-battery-full", 62016);
dict.Add("fa fa-battery-half", 62018);
dict.Add("fa fa-battery-quarter", 62019);
dict.Add("fa fa-battery-three-quarters", 62017);
dict.Add("fa fa-bed", 62006);
dict.Add("fa fa-beer", 61692);
dict.Add("fa fa-bell", 61683);
dict.Add("fa fa-bell-o", 61602);
dict.Add("fa fa-bell-slash", 61942);
dict.Add("fa fa-bell-slash-o", 61943);
dict.Add("fa fa-bicycle", 61958);
dict.Add("fa fa-binoculars", 61925);
dict.Add("fa fa-birthday-cake", 61949);
dict.Add("fa fa-bolt", 61671);
dict.Add("fa fa-bomb", 61922);
dict.Add("fa fa-book", 61485);
dict.Add("fa fa-bookmark", 61486);
dict.Add("fa fa-bookmark-o", 61591);
dict.Add("fa fa-briefcase", 61617);
dict.Add("fa fa-bug", 61832);
dict.Add("fa fa-building", 61869);
dict.Add("fa fa-building-o", 61687);
dict.Add("fa fa-bullhorn", 61601);
dict.Add("fa fa-bullseye", 61760);
dict.Add("fa fa-bus", 61959);
dict.Add("fa fa-cab", 61882);
dict.Add("fa fa-calculator", 61932);
dict.Add("fa fa-calendar", 61555);
dict.Add("fa fa-calendar-check-o", 62068);
dict.Add("fa fa-calendar-minus-o", 62066);
dict.Add("fa fa-calendar-o", 61747);
dict.Add("fa fa-calendar-plus-o", 62065);
dict.Add("fa fa-calendar-times-o", 62067);
dict.Add("fa fa-camera", 61488);
dict.Add("fa fa-camera-retro", 61571);
dict.Add("fa fa-car", 61881);
dict.Add("fa fa-caret-square-o-down", 61776);
dict.Add("fa fa-caret-square-o-left", 61841);
dict.Add("fa fa-caret-square-o-right", 61778);
dict.Add("fa fa-caret-square-o-up", 61777);
dict.Add("fa fa-cart-arrow-down", 61976);
dict.Add("fa fa-cart-plus", 61975);
dict.Add("fa fa-cc", 61962);
dict.Add("fa fa-certificate", 61603);
dict.Add("fa fa-check", 61452);
dict.Add("fa fa-check-circle", 61528);
dict.Add("fa fa-check-circle-o", 61533);
dict.Add("fa fa-check-square", 61770);
dict.Add("fa fa-check-square-o", 61510);
dict.Add("fa fa-child", 61870);
dict.Add("fa fa-circle", 61713);
dict.Add("fa fa-circle-o", 61708);
dict.Add("fa fa-circle-o-notch", 61902);
dict.Add("fa fa-circle-thin", 61915);
dict.Add("fa fa-clock-o", 61463);
dict.Add("fa fa-clone", 62029);
dict.Add("fa fa-close", 61453);
dict.Add("fa fa-cloud", 61634);
dict.Add("fa fa-cloud-download", 61677);
dict.Add("fa fa-cloud-upload", 61678);
dict.Add("fa fa-code", 61729);
dict.Add("fa fa-code-fork", 61734);
dict.Add("fa fa-coffee", 61684);
dict.Add("fa fa-cog", 61459);
dict.Add("fa fa-cogs", 61573);
dict.Add("fa fa-comment", 61557);
dict.Add("fa fa-comment-o", 61669);
dict.Add("fa fa-commenting", 62074);
dict.Add("fa fa-commenting-o", 62075);
dict.Add("fa fa-comments", 61574);
dict.Add("fa fa-comments-o", 61670);
dict.Add("fa fa-compass", 61774);
dict.Add("fa fa-copyright", 61945);
dict.Add("fa fa-creative-commons", 62046);
dict.Add("fa fa-credit-card", 61597);
dict.Add("fa fa-crop", 61733);
dict.Add("fa fa-crosshairs", 61531);
dict.Add("fa fa-cube", 61874);
dict.Add("fa fa-cubes", 61875);
dict.Add("fa fa-cutlery", 61685);
dict.Add("fa fa-dashboard", 61668);
dict.Add("fa fa-database", 61888);
dict.Add("fa fa-desktop", 61704);
dict.Add("fa fa-diamond", 61977);
dict.Add("fa fa-dot-circle-o", 61842);
dict.Add("fa fa-download", 61465);
dict.Add("fa fa-edit", 61508);
dict.Add("fa fa-ellipsis-h", 61761);
dict.Add("fa fa-ellipsis-v", 61762);
dict.Add("fa fa-envelope", 61664);
dict.Add("fa fa-envelope-o", 61443);
dict.Add("fa fa-envelope-square", 61849);
dict.Add("fa fa-eraser", 61741);
dict.Add("fa fa-exchange", 61676);
dict.Add("fa fa-exclamation", 61738);
dict.Add("fa fa-exclamation-circle", 61546);
dict.Add("fa fa-exclamation-triangle", 61553);
dict.Add("fa fa-external-link", 61582);
dict.Add("fa fa-external-link-square", 61772);
dict.Add("fa fa-eye", 61550);
dict.Add("fa fa-eye-slash", 61552);
dict.Add("fa fa-eyedropper", 61947);
dict.Add("fa fa-fax", 61868);
dict.Add("fa fa-feed", 61598);
dict.Add("fa fa-female", 61826);
dict.Add("fa fa-fighter-jet", 61691);
dict.Add("fa fa-file-archive-o", 61894);
dict.Add("fa fa-file-audio-o", 61895);
dict.Add("fa fa-file-code-o", 61897);
dict.Add("fa fa-file-excel-o", 61891);
dict.Add("fa fa-file-image-o", 61893);
dict.Add("fa fa-file-movie-o", 61896);
dict.Add("fa fa-file-pdf-o", 61889);
dict.Add("fa fa-file-photo-o", 61893);
dict.Add("fa fa-file-picture-o", 61893);
dict.Add("fa fa-file-powerpoint-o", 61892);
dict.Add("fa fa-file-sound-o", 61895);
dict.Add("fa fa-file-video-o", 61896);
dict.Add("fa fa-file-word-o", 61890);
dict.Add("fa fa-file-zip-o", 61894);
dict.Add("fa fa-film", 61448);
dict.Add("fa fa-filter", 61616);
dict.Add("fa fa-fire", 61549);
dict.Add("fa fa-fire-extinguisher", 61748);
dict.Add("fa fa-flag", 61476);
dict.Add("fa fa-flag-checkered", 61726);
dict.Add("fa fa-flag-o", 61725);
dict.Add("fa fa-flash", 61671);
dict.Add("fa fa-flask", 61635);
dict.Add("fa fa-folder", 61563);
dict.Add("fa fa-folder-o", 61716);
dict.Add("fa fa-folder-open", 61564);
dict.Add("fa fa-folder-open-o", 61717);
dict.Add("fa fa-frown-o", 61721);
dict.Add("fa fa-futbol-o", 61923);
dict.Add("fa fa-gamepad", 61723);
dict.Add("fa fa-gavel", 61667);
dict.Add("fa fa-gear", 61459);
dict.Add("fa fa-gears", 61573);
dict.Add("fa fa-gift", 61547);
dict.Add("fa fa-glass", 61440);
dict.Add("fa fa-globe", 61612);
dict.Add("fa fa-graduation-cap", 61853);
dict.Add("fa fa-group", 61632);
dict.Add("fa fa-hand-grab-o", 62037);
dict.Add("fa fa-hand-lizard-o", 62040);
dict.Add("fa fa-hand-paper-o", 62038);
dict.Add("fa fa-hand-peace-o", 62043);
dict.Add("fa fa-hand-pointer-o", 62042);
dict.Add("fa fa-hand-rock-o", 62037);
dict.Add("fa fa-hand-scissors-o", 62039);
dict.Add("fa fa-hand-spock-o", 62041);
dict.Add("fa fa-hand-stop-o", 62038);
dict.Add("fa fa-hdd-o", 61600);
dict.Add("fa fa-headphones", 61477);
dict.Add("fa fa-heart", 61444);
dict.Add("fa fa-heart-o", 61578);
dict.Add("fa fa-heartbeat", 61982);
dict.Add("fa fa-history", 61914);
dict.Add("fa fa-home", 61461);
dict.Add("fa fa-hotel", 62006);
dict.Add("fa fa-hourglass", 62036);
dict.Add("fa fa-hourglass-1", 62033);
dict.Add("fa fa-hourglass-2", 62034);
dict.Add("fa fa-hourglass-3", 62035);
dict.Add("fa fa-hourglass-end", 62035);
dict.Add("fa fa-hourglass-half", 62034);
dict.Add("fa fa-hourglass-o", 62032);
dict.Add("fa fa-hourglass-start", 62033);
dict.Add("fa fa-i-cursor", 62022);
dict.Add("fa fa-image", 61502);
dict.Add("fa fa-inbox", 61468);
dict.Add("fa fa-industry", 62069);
dict.Add("fa fa-info", 61737);
dict.Add("fa fa-info-circle", 61530);
dict.Add("fa fa-institution", 61852);
dict.Add("fa fa-key", 61572);
dict.Add("fa fa-keyboard-o", 61724);
dict.Add("fa fa-language", 61867);
dict.Add("fa fa-laptop", 61705);
dict.Add("fa fa-leaf", 61548);
dict.Add("fa fa-legal", 61667);
dict.Add("fa fa-lemon-o", 61588);
dict.Add("fa fa-level-down", 61769);
dict.Add("fa fa-level-up", 61768);
dict.Add("fa fa-life-bouy", 61901);
dict.Add("fa fa-life-buoy", 61901);
dict.Add("fa fa-life-ring", 61901);
dict.Add("fa fa-life-saver", 61901);
dict.Add("fa fa-lightbulb-o", 61675);
dict.Add("fa fa-line-chart", 61953);
dict.Add("fa fa-location-arrow", 61732);
dict.Add("fa fa-lock", 61475);
dict.Add("fa fa-magic", 61648);
dict.Add("fa fa-magnet", 61558);
dict.Add("fa fa-mail-forward", 61540);
dict.Add("fa fa-mail-reply", 61714);
dict.Add("fa fa-mail-reply-all", 61730);
dict.Add("fa fa-male", 61827);
dict.Add("fa fa-map", 62073);
dict.Add("fa fa-map-marker", 61505);
dict.Add("fa fa-map-o", 62072);
dict.Add("fa fa-map-pin", 62070);
dict.Add("fa fa-map-signs", 62071);
dict.Add("fa fa-meh-o", 61722);
dict.Add("fa fa-microphone", 61744);
dict.Add("fa fa-microphone-slash", 61745);
dict.Add("fa fa-minus", 61544);
dict.Add("fa fa-minus-circle", 61526);
dict.Add("fa fa-minus-square", 61766);
dict.Add("fa fa-minus-square-o", 61767);
dict.Add("fa fa-mobile", 61707);
dict.Add("fa fa-mobile-phone", 61707);
dict.Add("fa fa-money", 61654);
dict.Add("fa fa-moon-o", 61830);
dict.Add("fa fa-mortar-board", 61853);
dict.Add("fa fa-motorcycle", 61980);
dict.Add("fa fa-mouse-pointer", 62021);
dict.Add("fa fa-music", 61441);
dict.Add("fa fa-navicon", 61641);
dict.Add("fa fa-newspaper-o", 61930);
dict.Add("fa fa-object-group", 62023);
dict.Add("fa fa-object-ungroup", 62024);
dict.Add("fa fa-paint-brush", 61948);
dict.Add("fa fa-paper-plane", 61912);
dict.Add("fa fa-paper-plane-o", 61913);
dict.Add("fa fa-paw", 61872);
dict.Add("fa fa-pencil", 61504);
dict.Add("fa fa-pencil-square", 61771);
dict.Add("fa fa-pencil-square-o", 61508);
dict.Add("fa fa-phone", 61589);
dict.Add("fa fa-phone-square", 61592);
dict.Add("fa fa-photo", 61502);
dict.Add("fa fa-picture-o", 61502);
dict.Add("fa fa-pie-chart", 61952);
dict.Add("fa fa-plane", 61554);
dict.Add("fa fa-plug", 61926);
dict.Add("fa fa-plus", 61543);
dict.Add("fa fa-plus-circle", 61525);
dict.Add("fa fa-plus-square", 61694);
dict.Add("fa fa-plus-square-o", 61846);
dict.Add("fa fa-power-off", 61457);
dict.Add("fa fa-print", 61487);
dict.Add("fa fa-puzzle-piece", 61742);
dict.Add("fa fa-qrcode", 61481);
dict.Add("fa fa-question", 61736);
dict.Add("fa fa-question-circle", 61529);
dict.Add("fa fa-quote-left", 61709);
dict.Add("fa fa-quote-right", 61710);
dict.Add("fa fa-random", 61556);
dict.Add("fa fa-recycle", 61880);
dict.Add("fa fa-refresh", 61473);
dict.Add("fa fa-registered", 62045);
dict.Add("fa fa-remove", 61453);
dict.Add("fa fa-reorder", 61641);
dict.Add("fa fa-reply", 61714);
dict.Add("fa fa-reply-all", 61730);
dict.Add("fa fa-retweet", 61561);
dict.Add("fa fa-road", 61464);
dict.Add("fa fa-rocket", 61749);
dict.Add("fa fa-rss", 61598);
dict.Add("fa fa-rss-square", 61763);
dict.Add("fa fa-search", 61442);
dict.Add("fa fa-search-minus", 61456);
dict.Add("fa fa-search-plus", 61454);
dict.Add("fa fa-send", 61912);
dict.Add("fa fa-send-o", 61913);
dict.Add("fa fa-server", 62003);
dict.Add("fa fa-share", 61540);
dict.Add("fa fa-share-alt", 61920);
dict.Add("fa fa-share-alt-square", 61921);
dict.Add("fa fa-share-square", 61773);
dict.Add("fa fa-share-square-o", 61509);
dict.Add("fa fa-shield", 61746);
dict.Add("fa fa-ship", 61978);
dict.Add("fa fa-shopping-cart", 61562);
dict.Add("fa fa-sign-in", 61584);
dict.Add("fa fa-sign-out", 61579);
dict.Add("fa fa-signal", 61458);
dict.Add("fa fa-sitemap", 61672);
dict.Add("fa fa-sliders", 61918);
dict.Add("fa fa-smile-o", 61720);
dict.Add("fa fa-soccer-ball-o", 61923);
dict.Add("fa fa-sort", 61660);
dict.Add("fa fa-sort-alpha-asc", 61789);
dict.Add("fa fa-sort-alpha-desc", 61790);
dict.Add("fa fa-sort-amount-asc", 61792);
dict.Add("fa fa-sort-amount-desc", 61793);
dict.Add("fa fa-sort-asc", 61662);
dict.Add("fa fa-sort-desc", 61661);
dict.Add("fa fa-sort-down", 61661);
dict.Add("fa fa-sort-numeric-asc", 61794);
dict.Add("fa fa-sort-numeric-desc", 61795);
dict.Add("fa fa-sort-up", 61662);
dict.Add("fa fa-space-shuttle", 61847);
dict.Add("fa fa-spoon", 61873);
dict.Add("fa fa-square", 61640);
dict.Add("fa fa-square-o", 61590);
dict.Add("fa fa-star", 61445);
dict.Add("fa fa-star-half", 61577);
dict.Add("fa fa-star-half-empty", 61731);
dict.Add("fa fa-star-half-full", 61731);
dict.Add("fa fa-star-half-o", 61731);
dict.Add("fa fa-star-o", 61446);
dict.Add("fa fa-sticky-note", 62025);
dict.Add("fa fa-sticky-note-o", 62026);
dict.Add("fa fa-street-view", 61981);
dict.Add("fa fa-suitcase", 61682);
dict.Add("fa fa-sun-o", 61829);
dict.Add("fa fa-support", 61901);
dict.Add("fa fa-tablet", 61706);
dict.Add("fa fa-tachometer", 61668);
dict.Add("fa fa-tag", 61483);
dict.Add("fa fa-tags", 61484);
dict.Add("fa fa-tasks", 61614);
dict.Add("fa fa-taxi", 61882);
dict.Add("fa fa-television", 62060);
dict.Add("fa fa-terminal", 61728);
dict.Add("fa fa-thumb-tack", 61581);
dict.Add("fa fa-thumbs-down", 61797);
dict.Add("fa fa-thumbs-o-down", 61576);
dict.Add("fa fa-thumbs-o-up", 61575);
dict.Add("fa fa-thumbs-up", 61796);
dict.Add("fa fa-ticket", 61765);
dict.Add("fa fa-times", 61453);
dict.Add("fa fa-times-circle", 61527);
dict.Add("fa fa-times-circle-o", 61532);
dict.Add("fa fa-tint", 61507);
dict.Add("fa fa-toggle-down", 61776);
dict.Add("fa fa-toggle-left", 61841);
dict.Add("fa fa-toggle-off", 61956);
dict.Add("fa fa-toggle-on", 61957);
dict.Add("fa fa-toggle-right", 61778);
dict.Add("fa fa-toggle-up", 61777);
dict.Add("fa fa-trademark", 62044);
dict.Add("fa fa-trash", 61944);
dict.Add("fa fa-trash-o", 61460);
dict.Add("fa fa-tree", 61883);
dict.Add("fa fa-trophy", 61585);
dict.Add("fa fa-truck", 61649);
dict.Add("fa fa-tty", 61924);
dict.Add("fa fa-tv", 62060);
dict.Add("fa fa-umbrella", 61673);
dict.Add("fa fa-university", 61852);
dict.Add("fa fa-unlock", 61596);
dict.Add("fa fa-unlock-alt", 61758);
dict.Add("fa fa-unsorted", 61660);
dict.Add("fa fa-upload", 61587);
dict.Add("fa fa-user", 61447);
dict.Add("fa fa-user-plus", 62004);
dict.Add("fa fa-user-secret", 61979);
dict.Add("fa fa-user-times", 62005);
dict.Add("fa fa-users", 61632);
dict.Add("fa fa-video-camera", 61501);
dict.Add("fa fa-volume-down", 61479);
dict.Add("fa fa-volume-off", 61478);
dict.Add("fa fa-volume-up", 61480);
dict.Add("fa fa-warning", 61553);
dict.Add("fa fa-wheelchair", 61843);
dict.Add("fa fa-wifi", 61931);
dict.Add("fa fa-wrench", 61613);
dict.Add("fa fa-hand-o-down", 61607);
dict.Add("fa fa-hand-o-left", 61605);
dict.Add("fa fa-hand-o-right", 61604);
dict.Add("fa fa-hand-o-up", 61606);
dict.Add("fa fa-ambulance", 61689);
dict.Add("fa fa-subway", 62009);
dict.Add("fa fa-train", 62008);
dict.Add("fa fa-genderless", 61997);
dict.Add("fa fa-intersex", 61988);
dict.Add("fa fa-mars", 61986);
dict.Add("fa fa-mars-double", 61991);
dict.Add("fa fa-mars-stroke", 61993);
dict.Add("fa fa-mars-stroke-h", 61995);
dict.Add("fa fa-mars-stroke-v", 61994);
dict.Add("fa fa-mercury", 61987);
dict.Add("fa fa-neuter", 61996);
dict.Add("fa fa-transgender", 61988);
dict.Add("fa fa-transgender-alt", 61989);
dict.Add("fa fa-venus", 61985);
dict.Add("fa fa-venus-double", 61990);
dict.Add("fa fa-venus-mars", 61992);
dict.Add("fa fa-file", 61787);
dict.Add("fa fa-file-o", 61462);
dict.Add("fa fa-file-text", 61788);
dict.Add("fa fa-file-text-o", 61686);
dict.Add("fa fa-cc-amex", 61939);
dict.Add("fa fa-cc-diners-club", 62028);
dict.Add("fa fa-cc-discover", 61938);
dict.Add("fa fa-cc-jcb", 62027);
dict.Add("fa fa-cc-mastercard", 61937);
dict.Add("fa fa-cc-paypal", 61940);
dict.Add("fa fa-cc-stripe", 61941);
dict.Add("fa fa-cc-visa", 61936);
dict.Add("fa fa-google-wallet", 61934);
dict.Add("fa fa-paypal", 61933);
dict.Add("fa fa-bitcoin", 61786);
dict.Add("fa fa-btc", 61786);
dict.Add("fa fa-cny", 61783);
dict.Add("fa fa-dollar", 61781);
dict.Add("fa fa-eur", 61779);
dict.Add("fa fa-euro", 61779);
dict.Add("fa fa-gbp", 61780);
dict.Add("fa fa-gg", 62048);
dict.Add("fa fa-gg-circle", 62049);
dict.Add("fa fa-ils", 61963);
dict.Add("fa fa-inr", 61782);
dict.Add("fa fa-jpy", 61783);
dict.Add("fa fa-krw", 61785);
dict.Add("fa fa-rmb", 61783);
dict.Add("fa fa-rouble", 61784);
dict.Add("fa fa-rub", 61784);
dict.Add("fa fa-ruble", 61784);
dict.Add("fa fa-rupee", 61782);
dict.Add("fa fa-shekel", 61963);
dict.Add("fa fa-sheqel", 61963);
dict.Add("fa fa-try", 61845);
dict.Add("fa fa-turkish-lira", 61845);
dict.Add("fa fa-usd", 61781);
dict.Add("fa fa-won", 61785);
dict.Add("fa fa-yen", 61783);
dict.Add("fa fa-align-center", 61495);
dict.Add("fa fa-align-justify", 61497);
dict.Add("fa fa-align-left", 61494);
dict.Add("fa fa-align-right", 61496);
dict.Add("fa fa-bold", 61490);
dict.Add("fa fa-chain", 61633);
dict.Add("fa fa-chain-broken", 61735);
dict.Add("fa fa-clipboard", 61674);
dict.Add("fa fa-columns", 61659);
dict.Add("fa fa-copy", 61637);
dict.Add("fa fa-cut", 61636);
dict.Add("fa fa-dedent", 61499);
dict.Add("fa fa-files-o", 61637);
dict.Add("fa fa-floppy-o", 61639);
dict.Add("fa fa-font", 61489);
dict.Add("fa fa-header", 61916);
dict.Add("fa fa-indent", 61500);
dict.Add("fa fa-italic", 61491);
dict.Add("fa fa-link", 61633);
dict.Add("fa fa-list", 61498);
dict.Add("fa fa-list-alt", 61474);
dict.Add("fa fa-list-ol", 61643);
dict.Add("fa fa-list-ul", 61642);
dict.Add("fa fa-outdent", 61499);
dict.Add("fa fa-paperclip", 61638);
dict.Add("fa fa-paragraph", 61917);
dict.Add("fa fa-paste", 61674);
dict.Add("fa fa-repeat", 61470);
dict.Add("fa fa-rotate-left", 61666);
dict.Add("fa fa-rotate-right", 61470);
dict.Add("fa fa-save", 61639);
dict.Add("fa fa-scissors", 61636);
dict.Add("fa fa-strikethrough", 61644);
dict.Add("fa fa-subscript", 61740);
dict.Add("fa fa-superscript", 61739);
dict.Add("fa fa-table", 61646);
dict.Add("fa fa-text-height", 61492);
dict.Add("fa fa-text-width", 61493);
dict.Add("fa fa-th", 61450);
dict.Add("fa fa-th-large", 61449);
dict.Add("fa fa-th-list", 61451);
dict.Add("fa fa-underline", 61645);
dict.Add("fa fa-undo", 61666);
dict.Add("fa fa-unlink", 61735);
dict.Add("fa fa-angle-double-down", 61699);
dict.Add("fa fa-angle-double-left", 61696);
dict.Add("fa fa-angle-double-right", 61697);
dict.Add("fa fa-angle-double-up", 61698);
dict.Add("fa fa-angle-down", 61703);
dict.Add("fa fa-angle-left", 61700);
dict.Add("fa fa-angle-right", 61701);
dict.Add("fa fa-angle-up", 61702);
dict.Add("fa fa-arrow-circle-down", 61611);
dict.Add("fa fa-arrow-circle-left", 61608);
dict.Add("fa fa-arrow-circle-o-down", 61466);
dict.Add("fa fa-arrow-circle-o-left", 61840);
dict.Add("fa fa-arrow-circle-o-right", 61838);
dict.Add("fa fa-arrow-circle-o-up", 61467);
dict.Add("fa fa-arrow-circle-right", 61609);
dict.Add("fa fa-arrow-circle-up", 61610);
dict.Add("fa fa-arrow-down", 61539);
dict.Add("fa fa-arrow-left", 61536);
dict.Add("fa fa-arrow-right", 61537);
dict.Add("fa fa-arrow-up", 61538);
dict.Add("fa fa-arrows-alt", 61618);
dict.Add("fa fa-caret-down", 61655);
dict.Add("fa fa-caret-left", 61657);
dict.Add("fa fa-caret-right", 61658);
dict.Add("fa fa-caret-up", 61656);
dict.Add("fa fa-chevron-circle-down", 61754);
dict.Add("fa fa-chevron-circle-left", 61751);
dict.Add("fa fa-chevron-circle-right", 61752);
dict.Add("fa fa-chevron-circle-up", 61753);
dict.Add("fa fa-chevron-down", 61560);
dict.Add("fa fa-chevron-left", 61523);
dict.Add("fa fa-chevron-right", 61524);
dict.Add("fa fa-chevron-up", 61559);
dict.Add("fa fa-long-arrow-down", 61813);
dict.Add("fa fa-long-arrow-left", 61815);
dict.Add("fa fa-long-arrow-right", 61816);
dict.Add("fa fa-long-arrow-up", 61814);
dict.Add("fa fa-backward", 61514);
dict.Add("fa fa-compress", 61542);
dict.Add("fa fa-eject", 61522);
dict.Add("fa fa-expand", 61541);
dict.Add("fa fa-fast-backward", 61513);
dict.Add("fa fa-fast-forward", 61520);
dict.Add("fa fa-forward", 61518);
dict.Add("fa fa-pause", 61516);
dict.Add("fa fa-play", 61515);
dict.Add("fa fa-play-circle", 61764);
dict.Add("fa fa-play-circle-o", 61469);
dict.Add("fa fa-step-backward", 61512);
dict.Add("fa fa-step-forward", 61521);
dict.Add("fa fa-stop", 61517);
dict.Add("fa fa-youtube-play", 61802);
dict.Add("fa fa-500px", 62062);
dict.Add("fa fa-adn", 61808);
dict.Add("fa fa-amazon", 62064);
dict.Add("fa fa-android", 61819);
dict.Add("fa fa-angellist", 61961);
dict.Add("fa fa-apple", 61817);
dict.Add("fa fa-behance", 61876);
dict.Add("fa fa-behance-square", 61877);
dict.Add("fa fa-bitbucket", 61809);
dict.Add("fa fa-bitbucket-square", 61810);
dict.Add("fa fa-black-tie", 62078);
dict.Add("fa fa-buysellads", 61965);
dict.Add("fa fa-chrome", 62056);
dict.Add("fa fa-codepen", 61899);
dict.Add("fa fa-connectdevelop", 61966);
dict.Add("fa fa-contao", 62061);
dict.Add("fa fa-css3", 61756);
dict.Add("fa fa-dashcube", 61968);
dict.Add("fa fa-delicious", 61861);
dict.Add("fa fa-deviantart", 61885);
dict.Add("fa fa-digg", 61862);
dict.Add("fa fa-dribbble", 61821);
dict.Add("fa fa-dropbox", 61803);
dict.Add("fa fa-drupal", 61865);
dict.Add("fa fa-empire", 61905);
dict.Add("fa fa-expeditedssl", 62014);
dict.Add("fa fa-facebook", 61594);
dict.Add("fa fa-facebook-f", 61594);
dict.Add("fa fa-facebook-official", 62000);
dict.Add("fa fa-facebook-square", 61570);
dict.Add("fa fa-firefox", 62057);
dict.Add("fa fa-flickr", 61806);
dict.Add("fa fa-fonticons", 62080);
dict.Add("fa fa-forumbee", 61969);
dict.Add("fa fa-foursquare", 61824);
dict.Add("fa fa-ge", 61905);
dict.Add("fa fa-get-pocket", 62053);
dict.Add("fa fa-git", 61907);
dict.Add("fa fa-git-square", 61906);
dict.Add("fa fa-github", 61595);
dict.Add("fa fa-github-alt", 61715);
dict.Add("fa fa-github-square", 61586);
dict.Add("fa fa-gittip", 61828);
dict.Add("fa fa-google", 61856);
dict.Add("fa fa-google-plus", 61653);
dict.Add("fa fa-google-plus-square", 61652);
dict.Add("fa fa-gratipay", 61828);
dict.Add("fa fa-hacker-news", 61908);
dict.Add("fa fa-houzz", 62076);
dict.Add("fa fa-html5", 61755);
dict.Add("fa fa-instagram", 61805);
dict.Add("fa fa-internet-explorer", 62059);
dict.Add("fa fa-ioxhost", 61960);
dict.Add("fa fa-joomla", 61866);
dict.Add("fa fa-jsfiddle", 61900);
dict.Add("fa fa-lastfm", 61954);
dict.Add("fa fa-lastfm-square", 61955);
dict.Add("fa fa-leanpub", 61970);
dict.Add("fa fa-linkedin", 61665);
dict.Add("fa fa-linkedin-square", 61580);
dict.Add("fa fa-linux", 61820);
dict.Add("fa fa-maxcdn", 61750);
dict.Add("fa fa-meanpath", 61964);
dict.Add("fa fa-medium", 62010);
dict.Add("fa fa-odnoklassniki", 62051);
dict.Add("fa fa-odnoklassniki-square", 62052);
dict.Add("fa fa-opencart", 62013);
dict.Add("fa fa-openid", 61851);
dict.Add("fa fa-opera", 62058);
dict.Add("fa fa-optin-monster", 62012);
dict.Add("fa fa-pagelines", 61836);
dict.Add("fa fa-pied-piper", 62126);
dict.Add("fa fa-pied-piper-alt", 61864);
dict.Add("fa fa-pinterest", 61650);
dict.Add("fa fa-pinterest-p", 62001);
dict.Add("fa fa-pinterest-square", 61651);
dict.Add("fa fa-qq", 61910);
dict.Add("fa fa-ra", 61904);
dict.Add("fa fa-rebel", 61904);
dict.Add("fa fa-reddit", 61857);
dict.Add("fa fa-reddit-square", 61858);
dict.Add("fa fa-renren", 61835);
dict.Add("fa fa-safari", 62055);
dict.Add("fa fa-sellsy", 61971);
dict.Add("fa fa-shirtsinbulk", 61972);
dict.Add("fa fa-simplybuilt", 61973);
dict.Add("fa fa-skyatlas", 61974);
dict.Add("fa fa-skype", 61822);
dict.Add("fa fa-slack", 61848);
dict.Add("fa fa-slideshare", 61927);
dict.Add("fa fa-soundcloud", 61886);
dict.Add("fa fa-spotify", 61884);
dict.Add("fa fa-stack-exchange", 61837);
dict.Add("fa fa-stack-overflow", 61804);
dict.Add("fa fa-steam", 61878);
dict.Add("fa fa-steam-square", 61879);
dict.Add("fa fa-stumbleupon", 61860);
dict.Add("fa fa-stumbleupon-circle", 61859);
dict.Add("fa fa-tencent-weibo", 61909);
dict.Add("fa fa-trello", 61825);
dict.Add("fa fa-tripadvisor", 62050);
dict.Add("fa fa-tumblr", 61811);
dict.Add("fa fa-tumblr-square", 61812);
dict.Add("fa fa-twitch", 61928);
dict.Add("fa fa-twitter", 61593);
dict.Add("fa fa-twitter-square", 61569);
dict.Add("fa fa-viacoin", 62007);
dict.Add("fa fa-vimeo", 62077);
dict.Add("fa fa-vimeo-square", 61844);
dict.Add("fa fa-vine", 61898);
dict.Add("fa fa-vk", 61833);
dict.Add("fa fa-wechat", 61911);
dict.Add("fa fa-weibo", 61834);
dict.Add("fa fa-weixin", 61911);
dict.Add("fa fa-whatsapp", 62002);
dict.Add("fa fa-wikipedia-w", 62054);
dict.Add("fa fa-windows", 61818);
dict.Add("fa fa-wordpress", 61850);
dict.Add("fa fa-xing", 61800);
dict.Add("fa fa-xing-square", 61801);
dict.Add("fa fa-y-combinator", 62011);
dict.Add("fa fa-y-combinator-square", 61908);
dict.Add("fa fa-yahoo", 61854);
dict.Add("fa fa-yc", 62011);
dict.Add("fa fa-yc-square", 61908);
dict.Add("fa fa-yelp", 61929);
dict.Add("fa fa-youtube", 61799);
dict.Add("fa fa-youtube-square", 61798);
dict.Add("fa fa-h-square", 61693);
dict.Add("fa fa-hospital-o", 61688);
dict.Add("fa fa-medkit", 61690);
dict.Add("fa fa-stethoscope", 61681);
dict.Add("fa fa-user-md", 61680);
return dict;
}
}
}

View File

@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Common
{
public class MyConfig
{
public int EveryPageDataCount { get; set; }
/// <summary>
/// 数据库类型
/// </summary>
public string DbType { get; set; }
/// <summary>
/// 数据库主机IP
/// </summary>
public string DbHost { get; set; }
/// <summary>
/// 数据库名
/// </summary>
public string DbName { get; set; }
/// <summary>
/// 数据库用户名
/// </summary>
public string DbUserName { get; set; }
/// <summary>
/// 数据库密码
/// </summary>
public string DbPassword { get; set; }
private bool _debug = false;
/// <summary>
/// 是否调试模式,调试模式将会输出日志
/// </summary>
public bool Debug { get { return _debug; } set { _debug = value; } }
}
}

148
DH.RBAC/DH.RBAC.csproj Normal file
View File

@ -0,0 +1,148 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework>
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<BaseOutputPath>..\</BaseOutputPath>
<AppendTargetFrameworkToOutputPath>output</AppendTargetFrameworkToOutputPath>
<UseWindowsForms>true</UseWindowsForms>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<Platforms>AnyCPU;x64</Platforms>
</PropertyGroup>
<ItemGroup>
<Compile Include="AccountForm.cs" />
<Compile Include="AccountForm.Designer.cs" />
<Compile Include="Common\GlobalConfig.cs" />
<Compile Include="Common\IconDict.cs" />
<Compile Include="Common\MyConfig.cs" />
<Compile Include="Logic\BaseLogic.cs" />
<Compile Include="Logic\Logger.cs" />
<Compile Include="Logic\Sys\SysItemLogic.cs" />
<Compile Include="Logic\Sys\SysItemsDetailLogic.cs" />
<Compile Include="Logic\Sys\SysLogLogic.cs" />
<Compile Include="Logic\Sys\SysOrganizeLogic.cs" />
<Compile Include="Logic\Sys\SysPermissionLogic.cs" />
<Compile Include="Logic\Sys\SysRoleAuthorizeLogic.cs" />
<Compile Include="Logic\Sys\SysRoleLogic.cs" />
<Compile Include="Logic\Sys\SysUserLogic.cs" />
<Compile Include="Logic\Sys\SysUserLogOnLogic.cs" />
<Compile Include="Logic\Sys\SysUserRoleRelationLogic.cs" />
<Compile Include="Models\Base\BaseModelEntity.cs" />
<Compile Include="Models\Base\CodeGenerator.cs" />
<Compile Include="Models\Base\MenuControlAttribute.cs" />
<Compile Include="Models\DTO\Parms\AuthorParms.cs" />
<Compile Include="Models\DTO\Parms\FileUploadParms.cs" />
<Compile Include="Models\DTO\Parms\ItemDetailIndexParms.cs" />
<Compile Include="Models\DTO\Parms\KeyValue.cs" />
<Compile Include="Models\DTO\Parms\LogDeleteParms.cs" />
<Compile Include="Models\DTO\Parms\LogIndexParms.cs" />
<Compile Include="Models\DTO\Parms\LongPrimaryKeyParms.cs" />
<Compile Include="Models\DTO\Parms\ModifyPasswordParms.cs" />
<Compile Include="Models\DTO\Parms\RoleDeleteParms.cs" />
<Compile Include="Models\DTO\Parms\SearchParms.cs" />
<Compile Include="Models\DTO\Parms\StrPrimaryKeyParms.cs" />
<Compile Include="Models\DTO\Parms\UserDeleteParms.cs" />
<Compile Include="Models\DTO\Parms\UserLoginParms.cs" />
<Compile Include="Models\Enum\ModuleType.cs" />
<Compile Include="Models\Sys\SysItem.cs" />
<Compile Include="Models\Sys\SysItemDetail.cs" />
<Compile Include="Models\Sys\SysLog.cs" />
<Compile Include="Models\Sys\SysOrganize.cs" />
<Compile Include="Models\Sys\SysPermission.cs" />
<Compile Include="Models\Sys\SysRole.cs" />
<Compile Include="Models\Sys\SysRoleAuthorize.cs" />
<Compile Include="Models\Sys\SysUser.cs" />
<Compile Include="Models\Sys\SysUserLogOn.cs" />
<Compile Include="Models\Sys\SysUserRoleRelation.cs" />
<Compile Include="Properties\Resources.Designer.cs" />
<Compile Include="RBACWindow.cs" />
<Compile Include="RBACWindow.Designer.cs" />
<Compile Include="UserControls\AccountControl.cs" />
<Compile Include="UserControls\AccountControl.Designer.cs" />
<Compile Include="UserControls\Menus\UserMenuPanel.cs" />
<Compile Include="UserControls\ProgressForm.cs" />
<Compile Include="UserControls\ProgressForm.Designer.cs" />
<Compile Include="Utility\Extension\ExtMethods.cs" />
<Compile Include="Utility\Extension\MyEnvironment.cs" />
<Compile Include="Utility\Other\DESHelper.cs" />
<Compile Include="Utility\Other\FormHelper.cs" />
<Compile Include="Utility\Other\JsonHelper.cs" />
<Compile Include="Utility\Other\MD5Helper.cs" />
<Compile Include="Utility\Other\PanelScrollHelper.cs" />
<Compile Include="Utility\Other\ScreenUtils.cs" />
<Compile Include="Utility\Other\SnowFlakeHelper.cs" />
<Compile Include="Utility\Other\StringHelper.cs" />
<Compile Include="Utility\Other\TreeSelect.cs" />
<Compile Include="Utility\Other\UIUtils.cs" />
<Compile Include="Utility\Other\UUID.cs" />
<Compile Include="Utility\Other\ZTreeNode.cs" />
<Compile Include="Utility\PopupTool\GripBounds.cs" />
<Compile Include="Utility\PopupTool\Popup.cs" />
<Compile Include="Utility\PopupTool\UnsafeMethods.cs" />
<Compile Include="Views\DefaultPage.cs" />
<Compile Include="Views\DefaultPage.Designer.cs" />
<Compile Include="Views\EmptyPage.cs" />
<Compile Include="Views\EmptyPage.Designer.cs" />
<Compile Include="Views\MyPage.cs" />
<Compile Include="Views\Sys\BaseSubForm.cs" />
<Compile Include="Views\Sys\BaseSubForm.Designer.cs" />
<Compile Include="Views\Sys\Organize\AddOrganizeForm.cs" />
<Compile Include="Views\Sys\Organize\AddOrganizeForm.Designer.cs" />
<Compile Include="Views\Sys\Organize\OrganizePage.cs" />
<Compile Include="Views\Sys\Organize\OrganizePage.Designer.cs" />
<Compile Include="Views\Sys\Permission\AddPermissionForm.cs" />
<Compile Include="Views\Sys\Permission\AddPermissionForm.Designer.cs" />
<Compile Include="Views\Sys\Permission\IconForm.cs" />
<Compile Include="Views\Sys\Permission\IconForm.Designer.cs" />
<Compile Include="Views\Sys\Permission\PermissionPage.cs" />
<Compile Include="Views\Sys\Permission\PermissionPage.Designer.cs" />
<Compile Include="Views\Sys\Role\AddRoleForm.cs" />
<Compile Include="Views\Sys\Role\AddRoleForm.Designer.cs" />
<Compile Include="Views\Sys\Role\RoleAuthorizeForm.cs" />
<Compile Include="Views\Sys\Role\RoleAuthorizeForm.Designer.cs" />
<Compile Include="Views\Sys\Role\RolePage.cs" />
<Compile Include="Views\Sys\Role\RolePage.Designer.cs" />
<Compile Include="Views\Sys\User\AddUserForm.cs" />
<Compile Include="Views\Sys\User\AddUserForm.Designer.cs" />
<Compile Include="Views\Sys\User\UserPage.cs" />
<Compile Include="Views\Sys\User\UserPage.Designer.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="favicon.ico" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AntdUI" Version="1.8.9" />
<PackageReference Include="JinianNet.JNTemplate" Version="2.4.2" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="SqlSugarCore" Version="5.1.4.185" />
<PackageReference Include="SunnyUI" Version="3.8.2" />
<PackageReference Include="System.Data.SqlClient" Version="4.9.0" />
<PackageReference Include="System.Data.SQLite" Version="1.0.119" />
<PackageReference Include="System.Drawing.Common" Version="9.0.3" />
</ItemGroup>
<!-- 自动生成 -->
<ItemGroup>
<Compile Update="Page\DefaultPage.cs" />
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ProjectExtensions>
<VisualStudio>
<UserProperties configs_4config_1json__JsonSchema="" />
</VisualStudio>
</ProjectExtensions>
</Project>

303
DH.RBAC/Logic/BaseLogic.cs Normal file
View File

@ -0,0 +1,303 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using DH.RBAC.Model.Base;
using JinianNet.JNTemplate;
using DH.RBAC.Utility.Other;
using DH.RBAC.Utility.Extension;
namespace DH.RBAC.Logic.Base
{
public class BaseLogic
{
private static string ConnectionString;
private static SqlSugar.DbType DbType;
private static string DbName;
private static bool DebugMode;
public static bool InitDB(string dbType, string host, string dbName, string userName, string pasword, ref string message, bool debug = false)
{
DebugMode = debug;
DbName = dbName;
if (dbType.ToLower() == "SqlServer".ToLower())
{
DbType = SqlSugar.DbType.SqlServer;
ConnectionString = $"Data Source={host};Initial Catalog={dbName};User ID={userName};Password={pasword};";
return true;
}
else if (dbType.ToLower() == "MySql".ToLower())
{
DbType = SqlSugar.DbType.MySql;
ConnectionString = $"server={host};Database={dbName};Uid={userName};Pwd={pasword};";
return true;
}
else if (dbType.ToLower() == "Oracle".ToLower())
{
DbType = SqlSugar.DbType.Oracle;
ConnectionString = $"Data Source={host}/{dbName};User ID={userName};Password={pasword};";
return true;
}
else if (dbType.ToLower() == "PostgreSql".ToLower())
{
DbType = SqlSugar.DbType.PostgreSQL;
ConnectionString = $"Server={host};Port=5432;Database={dbName};User Id={userName};Password={pasword};";
return true;
}
else if (dbType.ToLower() == "Sqlite".ToLower())
{
DbType = SqlSugar.DbType.Sqlite;
var template = Engine.CreateTemplate(dbName);
template.Set("BaseDirectory", MyEnvironment.RootPath(""));
var result = template.Render();
ConnectionString = $"DataSource={result};";
return true;
}
else
{
message = "不支持的数据库";
return false;
}
}
public static SqlSugarClient GetInstance()
{
#if !NETFRAMEWORK && !WINDOWS
SqlSugarScope client = (SqlSugar.SqlSugarScope)Utility.MiddleWare.AutofacContainerModule.GetService<ISqlSugarClient>();
if (client != null)
return client.ScopedContext;
#endif
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = ConnectionString,
DbType = DbType,
IsAutoCloseConnection = true,
ConfigureExternalServices = new ConfigureExternalServices()
{
SqlFuncServices = ExtMethods.GetExpMethods
}
});
//用来打印Sql方便你调式
db.Aop.OnLogExecuting = (sql, pars) =>
{
if (DebugMode)
{
Console.WriteLine(sql + "\r\n" +
db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
Console.WriteLine();
}
};
return db;
}
public DataTable GetTableColumnInfo(string tableName)
{
if (DbType == SqlSugar.DbType.SqlServer)
{
using (var db = GetInstance())
{
StringBuilder strSql = new StringBuilder();
strSql.Append(" SELECT ").AppendLine();
strSql.Append(" A.Name AS TableName, ").AppendLine();
strSql.Append(" B.Name AS ColumnName, ").AppendLine();
strSql.Append(" D.Name AS TypeName, ").AppendLine();
strSql.Append(" B.Max_Length AS TypeLength, ").AppendLine();
strSql.Append(" CASE WHEN ").AppendLine();
strSql.Append(" ( ").AppendLine();
strSql.Append(" SELECT ").AppendLine();
strSql.Append(" F.Name ").AppendLine();
strSql.Append(" FROM ").AppendLine();
strSql.Append(" information_schema.key_column_usage E,sys.indexes F ").AppendLine();
strSql.Append(" WHERE ").AppendLine();
strSql.Append(" F.object_id=B.object_id ").AppendLine();
strSql.Append(" AND F.name=E.constraint_name ").AppendLine();
strSql.Append(" AND F.is_primary_key=1 ").AppendLine();
strSql.Append(" AND E.table_name=A.Name ").AppendLine();
strSql.Append(" AND E.column_name =B.Name ").AppendLine();
strSql.Append(" ) IS NULL THEN 0 ELSE 1 END AS IsPrimaryKey, ").AppendLine();
strSql.Append(" '' AS ClassName, ").AppendLine();
strSql.Append(" '' AS PropertyName, ").AppendLine();
strSql.Append(" '' AS CSType, ").AppendLine();
strSql.Append(" C.VALUE AS Other ").AppendLine();
strSql.Append(" FROM sys.tables A ").AppendLine();
strSql.Append(" LEFT JOIN sys.columns B ").AppendLine();
strSql.Append(" ON B.object_id = A.object_id ").AppendLine();
strSql.Append(" LEFT JOIN sys.extended_properties C ").AppendLine();
strSql.Append(" ON C.major_id = B.object_id AND C.minor_id = B.column_id ").AppendLine();
strSql.Append(" LEFT JOIN sys.types D ON D.system_type_id=B.system_type_id ").AppendLine();
strSql.Append(" WHERE A.Name = '" + tableName + "' ").AppendLine();
DataTable dt = db.Ado.GetDataTable(strSql.ToString());
return dt;
}
}
else if (DbType == SqlSugar.DbType.MySql)
{
using (var db = GetInstance())
{
StringBuilder strSql = new StringBuilder();
strSql.Append(" SELECT ").AppendLine();
strSql.Append(" '" + tableName + "' AS TableName, ").AppendLine();
strSql.Append(" COLUMN_NAME AS ColumnName, ").AppendLine();
strSql.Append(" DATA_TYPE AS TypeName, ").AppendLine();
strSql.Append(" CHARACTER_MAXIMUM_LENGTH AS TypeLength, ").AppendLine();
strSql.Append(" case when COLUMN_KEY = 'PRI' THEN 1 ELSE 0 END AS IsPrimaryKey, ").AppendLine();
strSql.Append(" '' AS ClassName, ").AppendLine();
strSql.Append(" '' PropertyName, ").AppendLine();
strSql.Append(" '' CSType , ").AppendLine();
strSql.Append(" COLUMN_COMMENT AS Other ").AppendLine();
strSql.Append(" FROM ").AppendLine();
strSql.Append(" INFORMATION_SCHEMA.COLUMNS ").AppendLine();
strSql.Append(" WHERE ").AppendLine();
strSql.Append(" table_schema ='" + DbName + "' AND table_name = '" + tableName + "' ").AppendLine();
strSql.Append(" ORDER BY ORDINAL_POSITION ").AppendLine();
DataTable dt = db.Ado.GetDataTable(strSql.ToString());
return dt;
}
}
else if (DbType == SqlSugar.DbType.Sqlite)
{
using (var db = GetInstance())
{
string sql = "SELECT * from sqlite_master where type = 'table' AND tbl_name='" + tableName + "'";
DataTable dt = db.Ado.GetDataTable(sql);
//创建个新的DataTable,把dt中的数据放进去
DataTable newDt = new DataTable();
newDt.Columns.Add("TableName");
newDt.Columns.Add("ColumnName");
newDt.Columns.Add("TypeName");
newDt.Columns.Add("TypeLength");
newDt.Columns.Add("IsPrimaryKey");
newDt.Columns.Add("ClassName");
newDt.Columns.Add("PropertyName");
newDt.Columns.Add("CSType");
newDt.Columns.Add("Other");
if (dt == null || dt.Rows.Count == 0)
return newDt;
string sql1 = dt.Rows[0]["sql"].ToString().Replace("\"", "");
List<CodeGenerator> list = new List<CodeGenerator>();
//第一个(
int index1 = sql1.IndexOf("(");
int index2 = sql1.LastIndexOf(")");
string content = sql1.Substring(index1 + 1, index2 - index1 - 1);
List<string> array = content.Split('\n').Select(it => it.Trim()).ToList();
List<string> primaryKey = new List<string>();
foreach (string item in array)
{
if (item.Trim() == "")
continue;
if (item.ToUpper().StartsWith("PRIMARY KEY"))
{
int index3 = item.IndexOf("(");
int index4 = item.IndexOf(")");
string[] keyArray = item.Substring(index3 + 1, index4 - index3 - 1).Split(',');
foreach (string key in keyArray)
primaryKey.Add(key.Trim());
continue;
}
string[] itemText = item.Trim().Split(' ');
CodeGenerator codeGenerator = new CodeGenerator();
codeGenerator.TableName = tableName;
codeGenerator.ColumnName = itemText[0];
string type = itemText[1];
int index5 = type.IndexOf("(");
int index6 = type.IndexOf(")");
codeGenerator.TypeName = index5 == -1 ? type : type.Substring(0, index5);
codeGenerator.TypeLength = index5 == -1 ? "0" : type.Substring(index5 + 1, index6 - index5 - 1);
codeGenerator.IsPrimaryKey = "0";
codeGenerator.ClassName = "";
codeGenerator.PropertyName = "";
codeGenerator.CSType = "";
codeGenerator.Other = "";
list.Add(codeGenerator);
}
foreach (CodeGenerator code in list)
{
if (primaryKey.Contains(code.ColumnName))
code.IsPrimaryKey = "1";
}
return list.ToJson().ToDataTable();
}
}
return null;
}
public List<string> GetTableList()
{
if (DbType == SqlSugar.DbType.SqlServer)
{
using (var db = GetInstance())
{
StringBuilder strSql = new StringBuilder();
strSql.Append(" SELECT ").AppendLine();
strSql.Append(" A.Name ").AppendLine();
strSql.Append(" FROM ").AppendLine();
strSql.Append(" sysobjects A ").AppendLine();
strSql.Append(" WHERE ").AppendLine();
strSql.Append(" A.xtype = 'U' ").AppendLine();
DataTable dt = db.Ado.GetDataTable(strSql.ToString());
if (dt == null)
return new List<string>();
List<string> list = new List<string>();
foreach (DataRow row in dt.Rows)
{
list.Add(row["Name"].ToString());
}
return list;
}
}
else if (DbType == SqlSugar.DbType.MySql)
{
using (var db = GetInstance())
{
StringBuilder strSql = new StringBuilder();
strSql.Append(" SELECT ").AppendLine();
strSql.Append(" TABLE_NAME AS Name ").AppendLine();
strSql.Append(" FROM ").AppendLine();
strSql.Append(" information_schema.TABLES ").AppendLine();
strSql.Append(" WHERE ").AppendLine();
strSql.Append(" TABLE_SCHEMA = '" + DbName + "' ").AppendLine();
DataTable dt = db.Ado.GetDataTable(strSql.ToString());
if (dt == null)
return new List<string>();
List<string> list = new List<string>();
foreach (DataRow row in dt.Rows)
{
list.Add(row["Name"].ToString());
}
return list;
}
}
else if (DbType == SqlSugar.DbType.Sqlite)
{
using (var db = GetInstance())
{
string sql = "SELECT name from sqlite_master where type='table'";
DataTable dt = db.Ado.GetDataTable(sql);
if (dt == null)
return new List<string>();
List<string> list = new List<string>();
foreach (DataRow row in dt.Rows)
{
list.Add(row["name"].ToString());
}
return list;
}
}
return new List<string>();
}
}
}

80
DH.RBAC/Logic/Logger.cs Normal file
View File

@ -0,0 +1,80 @@
using DH.RBAC.Model.Sys;
using DH.RBAC.Logic.Base;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using DH.RBAC.Utility.Other;
namespace DH.RBAC.Logic
{
/// <summary>
/// 日志
/// </summary>
public class Logger
{
private static object _lock = new object();
private static void Log(string type, string message)
{
lock (_lock)
{
SimpleClient<SysLog> client = new SimpleClient<SysLog>(BaseLogic.GetInstance());
SysLog log = new SysLog();
log.Id = UUID.SnowId;
log.Type = type;
#if !NETFRAMEWORK
log.ThreadId = Thread.GetCurrentProcessorId();
#else
log.ThreadId = Thread.CurrentThread.ManagedThreadId;
#endif
log.Message = message;
log.EnableFlag = "Y";
log.DeleteFlag = "N";
log.CreateTime = DateTime.Now;
log.CreateUserId = "1";
log.ModifyUserId = "1";
log.ModifyTime = log.CreateTime;
client.Insert(log);
}
}
/// <summary>
/// 操作日志写入
/// </summary>
/// <param name="message"></param>
public static void OperateInfo(string message)
{
Log("Operate", message);
}
/// <summary>
/// 运行日志写入
/// </summary>
/// <param name="message"></param>
public static void RunningInfo(string message)
{
Log("Running", message);
}
/// <summary>
/// 错误日志写入
/// </summary>
/// <param name="message"></param>
public static void ErrorInfo(string message)
{
Log("Error", message);
}
}
}

View File

@ -0,0 +1,167 @@
using DH.RBAC.Model.Sys;
using DH.RBAC.Logic.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SqlSugar;
using DH.RBAC.Utility.Other;
namespace DH.RBAC.Logic.Sys
{
public class SysItemLogic : BaseLogic
{
public List<SysItem> GetList()
{
using (var db = GetInstance())
{
return db.Queryable<SysItem>().Where(it => it.DeleteFlag == "N")
.Includes(it => it.CreateUser)
.Includes(it => it.ModifyUser)
.OrderBy(it => it.SortCode)
.ToList();
}
}
public List<SysItem> GetAppList(int pageIndex, int pageSize, ref int totalCount)
{
using (var db = GetInstance())
{
return db.Queryable<SysItem>().Where(it => it.ParentId != "0" && it.DeleteFlag == "N")
.Includes(it => it.CreateUser)
.Includes(it => it.ModifyUser)
.OrderBy(it => it.SortCode)
.ToPageList(pageIndex, pageSize, ref totalCount);
}
}
public List<SysItem> GetList(int pageIndex, int pageSize, string keyWord, ref int totalCount)
{
using (var db = GetInstance())
{
ISugarQueryable<SysItem> queryable = db.Queryable<SysItem>().Where(it => it.DeleteFlag == "N");
if (!string.IsNullOrWhiteSpace(keyWord))
{
queryable = queryable.Where(it => (it.Name.Contains(keyWord) || it.EnCode.Contains(keyWord)));
}
return queryable
.Includes(it => it.CreateUser)
.Includes(it => it.ModifyUser)
.OrderBy(it => it.SortCode)
.ToPageList(pageIndex, pageSize, ref totalCount);
}
}
public int GetChildCount(string parentId)
{
using (var db = GetInstance())
{
return db.Queryable<SysItem>()
.Where(it => it.ParentId == parentId && it.DeleteFlag == "N")
.ToList().Count();
}
}
public SysItem Get(string primaryKey)
{
using (var db = GetInstance())
{
return db.Queryable<SysItem>().Where(it => it.DeleteFlag == "N")
.Where(it => it.Id == primaryKey)
.Includes(it => it.CreateUser)
.Includes(it => it.ModifyUser)
.First();
}
}
public int AppInsert(SysItem model, string operateUser)
{
using (var db = GetInstance())
{
SysItem s = db.Queryable<SysItem>().Where(it => it.ParentId == "0").First();
model.Id = UUID.StrSnowId;
model.Layer = s.Layer + 1;
model.ParentId = s.Id;
model.DeleteFlag = "N";
model.CreateUserId = operateUser;
model.CreateTime = DateTime.Now;
model.ModifyUserId = model.CreateUser.Id;
model.ModifyTime = model.CreateTime;
return db.Insertable<SysItem>(model).ExecuteCommand();
}
}
public int Insert(SysItem model, string account)
{
using (var db = GetInstance())
{
model.Id = UUID.StrSnowId;
model.Layer = Get(model.ParentId).Layer += 1;
model.DeleteFlag = "N";
model.CreateUserId = account;
model.CreateTime = DateTime.Now;
model.ModifyUserId = model.CreateUserId;
model.ModifyTime = model.CreateTime;
return db.Insertable<SysItem>(model).ExecuteCommand();
}
}
public int Delete(string primaryKey)
{
using (var db = GetInstance())
{
SysItem item = db.Queryable<SysItem>().Where(it => it.Id == primaryKey).First();
if (item == null)
return 0;
item.DeleteFlag = "Y";
return db.Updateable<SysItem>(item).ExecuteCommand();
}
}
public int Update(SysItem model, string account)
{
using (var db = GetInstance())
{
model.Layer = Get(model.ParentId).Layer += 1;
model.ModifyUserId = account;
model.ModifyTime = DateTime.Now;
return db.Updateable<SysItem>(model).UpdateColumns(it => new
{
it.ParentId,
it.Layer,
it.EnCode,
it.Name,
it.SortCode,
it.EnableFlag,
it.Remark,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
}
}
public int AppUpdate(SysItem model, string operateUser)
{
using (var db = GetInstance())
{
model.ModifyUserId = operateUser;
model.ModifyTime = DateTime.Now;
return db.Updateable<SysItem>(model).UpdateColumns(it => new
{
it.EnCode,
it.Name,
it.SortCode,
it.Remark,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
}
}
}
}

View File

@ -0,0 +1,182 @@
using DH.RBAC.Model.Sys;
using DH.RBAC.Logic.Base;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DH.RBAC.Utility.Other;
namespace DH.RBAC.Logic.Sys
{
public class SysItemsDetailLogic : BaseLogic
{
public List<SysItemDetail> GetItemDetailList(string strItemCode)
{
using (var db = GetInstance())
{
SysItem item = db.Queryable<SysItem>().Where(it => it.EnCode == strItemCode && it.DeleteFlag == "N").First();
if (null == item)
return null;
return db.Queryable<SysItemDetail>().Where(it => it.ItemId == item.Id && it.DeleteFlag == "N")
.Includes(it => it.CreateUser)
.Includes(it => it.ModifyUser)
.OrderBy(it => it.SortCode)
.ToList();
}
}
public List<SysItemDetail> GetList(int pageIndex, int pageSize, string itemId, string keyWord, ref int totalCount)
{
using (var db = GetInstance())
{
ISugarQueryable<SysItemDetail> queryable = db.Queryable<SysItemDetail>().Where(it => it.DeleteFlag == "N" && it.ItemId == itemId);
if (!keyWord.IsNullOrEmpty())
{
queryable = queryable.Where(it => (it.Name.Contains(keyWord) || it.EnCode.Contains(keyWord)));
}
return queryable
.Includes(it => it.CreateUser)
.Includes(it => it.ModifyUser)
.OrderBy(it => it.SortCode)
.ToPageList(pageIndex, pageSize, ref totalCount);
}
}
public List<SysItemDetail> GetListByItemId(string itemId)
{
using (var db = GetInstance())
{
return db.Queryable<SysItemDetail>()
.Where(it => it.ItemId == itemId && it.DeleteFlag == "N")
.Includes(it => it.CreateUser)
.Includes(it => it.ModifyUser)
.ToList();
}
}
public void InsertItemDetail(string itemId, List<SysItemDetail> list)
{
using (var db = GetInstance())
{
try
{
db.BeginTran();
List<SysItemDetail> list2 = db.Queryable<SysItemDetail>().Where(it => it.ItemId == itemId && it.DeleteFlag == "N").ToList();
list2.ForEach(it => { it.DeleteFlag = "Y"; });
db.Updateable<SysItemDetail>(list2).ExecuteCommand();
db.Insertable<SysItemDetail>(list).ExecuteCommand();
db.CommitTran();
}
catch
{
db.RollbackTran();
}
}
}
public SysItemDetail Get(string primaryKey)
{
using (var db = GetInstance())
{
return db.Queryable<SysItemDetail>()
.Where(it => it.DeleteFlag == "N" && it.Id == primaryKey)
.Includes(it => it.CreateUser)
.Includes(it => it.ModifyUser)
.First();
}
}
public int Insert(SysItemDetail model, string account)
{
using (var db = GetInstance())
{
model.Id = UUID.StrSnowId;
model.IsDefault = model.IsDefault == null ? "0" : "1";
model.DeleteFlag = "N";
model.CreateUserId = account;
model.CreateTime = DateTime.Now;
model.ModifyUserId = model.CreateUserId;
model.ModifyTime = model.CreateTime;
return db.Insertable<SysItemDetail>(model).ExecuteCommand();
}
}
public int AppInsert(SysItemDetail model, string operateUser)
{
using (var db = GetInstance())
{
model.Id = UUID.StrSnowId;
model.IsDefault = "0";
model.DeleteFlag = "N";
model.CreateUserId = operateUser;
model.CreateTime = DateTime.Now;
model.ModifyUserId = model.CreateUserId;
model.ModifyTime = model.CreateTime;
return db.Insertable<SysItemDetail>(model).ExecuteCommand();
}
}
public int AppUpdate(SysItemDetail model, string operateUser)
{
using (var db = GetInstance())
{
model.ModifyUserId = operateUser;
model.ModifyTime = DateTime.Now;
return db.Updateable<SysItemDetail>(model).UpdateColumns(it => new
{
it.EnCode,
it.Name,
it.SortCode,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
}
}
public int Delete(string itemId)
{
using (var db = GetInstance())
{
SysItemDetail itemDetail = db.Queryable<SysItemDetail>().Where(it => it.Id == itemId).First();
if (itemDetail == null)
return 0;
itemDetail.DeleteFlag = "Y";
return db.Updateable<SysItemDetail>(itemDetail).ExecuteCommand();
}
}
public int Update(SysItemDetail model, string account)
{
using (var db = GetInstance())
{
model.IsDefault = model.IsDefault == null ? "0" : "1";
model.ModifyUserId = account;
model.ModifyTime = DateTime.Now;
return db.Updateable<SysItemDetail>(model).UpdateColumns(it => new
{
it.ItemId,
it.EnCode,
it.Name,
it.IsDefault,
it.SortCode,
it.EnableFlag,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
}
}
public SysItemDetail GetSoftwareName()
{
using (var db = GetInstance())
{
return db.Queryable<SysItemDetail>().Where(it => it.EnCode == "SoftwareName").First();
}
}
}
}

View File

@ -0,0 +1,123 @@
using DH.RBAC.Model.Sys;
using DH.RBAC.Logic.Base;
using SqlSugar;
using System;
using System.Collections.Generic;
using DH.RBAC.Utility.Other;
namespace DH.RBAC.Logic.Sys
{
/// <summary>
/// 系统日志表数据访问
/// </summary>
public class SysLogLogic : BaseLogic
{
/// <summary>
/// 根据日志类型获得日志
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="type"></param>
/// <param name="index"></param>
/// <param name="keyWord"></param>
/// <param name="totalCount"></param>
/// <returns></returns>
public List<SysLog> GetList(int pageIndex, int pageSize, string type, string index, string keyWord, ref int totalCount)
{
using (var db = GetInstance())
{
ISugarQueryable<SysLog> query = db.Queryable<SysLog>().Where(it => it.Type == type);
if (!keyWord.IsNullOrEmpty())
{
query = query.Where(it => it.Message.Contains(keyWord));
}
//查询当日
if (index == "1")
{
DateTime today = DateTime.Today;
DateTime startTime = today;
DateTime endTime = today.AddDays(1);
query = query.Where(it => it.CreateTime >= startTime && it.CreateTime < endTime);
}
//近7天
else if (index == "2")
{
DateTime today = DateTime.Today;
DateTime startTime = today.AddDays(-6);
DateTime endTime = today.AddDays(1);
query = query.Where(it => it.CreateTime >= startTime && it.CreateTime < endTime);
}
//近1月
else if (index == "3")
{
DateTime today = DateTime.Today;
DateTime startTime = today.AddDays(-29);
DateTime endTime = today.AddDays(1);
query = query.Where(it => it.CreateTime >= startTime && it.CreateTime < endTime);
}
//近3月
else if (index == "4")
{
DateTime today = DateTime.Today;
DateTime startTime = today.AddDays(-91);
DateTime endTime = today.AddDays(1);
query = query.Where(it => it.CreateTime >= startTime && it.CreateTime < endTime);
}
return query.OrderBy(it => it.Id, OrderByType.Desc).ToPageList(pageIndex, pageSize, ref totalCount);
}
}
/// <summary>
/// 删除日志
/// </summary>
/// <param name="type"></param>
/// <param name="index"></param>
/// <returns></returns>
public int Delete(string type, string index)
{
using (var db = GetInstance())
{
IDeleteable<SysLog> query = db.Deleteable<SysLog>().Where(it => it.Type == type);
//保留一个月
if (index == "1")
{
DateTime today = DateTime.Today;
DateTime startTime = today;
DateTime endTime = today.AddDays(-29);
query = query.Where(it => it.CreateTime < endTime);
return query.ExecuteCommand();
}
//保留7天
else if (index == "2")
{
DateTime today = DateTime.Today;
DateTime startTime = today.AddDays(-6);
query = query.Where(it => it.CreateTime < startTime);
return query.ExecuteCommand();
}
//保留近3个月
else if (index == "3")
{
DateTime today = DateTime.Today;
DateTime startTime = today.AddDays(-92);
query = query.Where(it => it.CreateTime < startTime);
return query.ExecuteCommand();
}
//全部
else if (index == "4")
{
return query.ExecuteCommand();
}
else
{
return 0;
}
}
}
}
}

View File

@ -0,0 +1,157 @@
using DH.RBAC.Model.Sys;
using DH.RBAC.Logic.Base;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DH.RBAC.Utility.Other;
namespace DH.RBAC.Logic.Sys
{
public class SysOrganizeLogic : BaseLogic
{
public List<SysOrganize> GetList()
{
using (var db = GetInstance())
{
return db.Queryable<SysOrganize>().Where(it => it.DeleteFlag == "N").ToList();
}
}
public List<SysOrganize> GetList(int pageIndex, int pageSize, string keyWord, ref int totalCount)
{
using (var db = GetInstance())
{
ISugarQueryable<SysOrganize> queryable = db.Queryable<SysOrganize>().Where(it => it.ParentId != "0" && it.DeleteFlag == "N");
if (!keyWord.IsNullOrEmpty())
{
queryable = queryable.Where(it => (it.FullName.Contains(keyWord) || it.EnCode.Contains(keyWord)));
}
return queryable
.OrderBy(it => it.SortCode)
.ToPageList(pageIndex, pageSize, ref totalCount);
}
}
public int GetChildCount(string parentId)
{
using (var db = GetInstance())
{
return db.Queryable<SysOrganize>().Where(it => it.ParentId == parentId && it.DeleteFlag == "N").Count();
}
}
public int AppUpdate(SysOrganize model, string opreaterUser)
{
using (var db = GetInstance())
{
model.ModifyUserId = opreaterUser;
model.ModifyTime = DateTime.Now;
return db.Updateable<SysOrganize>(model).UpdateColumns(it => new
{
it.EnCode,
it.FullName,
it.Type,
it.ManagerId,
it.TelePhone,
it.WeChat,
it.Fax,
it.Email,
it.Address,
it.SortCode,
it.Remark,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
}
}
public int AppInsert(SysOrganize model, string opreaterUser)
{
using (var db = GetInstance())
{
SysOrganize s = db.Queryable<SysOrganize>().Where(it => it.ParentId == "0").First();
model.Id = UUID.StrSnowId;
model.Layer = s.Layer + 1;
model.ParentId = s.Id;
model.EnableFlag = "Y";
model.DeleteFlag = "N";
model.CreateUserId = opreaterUser;
model.CreateTime = DateTime.Now;
model.ModifyUserId = model.CreateUserId;
model.ModifyTime = model.CreateTime;
return db.Insertable<SysOrganize>(model).ExecuteCommand();
}
}
public int Insert(SysOrganize model, string account)
{
using (var db = GetInstance())
{
model.Id = UUID.StrSnowId;
model.Layer = Get(model.ParentId).Layer += 1;
model.EnableFlag = "Y";
model.DeleteFlag = "N";
model.CreateUserId = account;
model.CreateTime = DateTime.Now;
model.ModifyUserId = model.CreateUserId;
model.ModifyTime = model.CreateTime;
return db.Insertable<SysOrganize>(model).ExecuteCommand();
}
}
public int Delete(string primaryKey)
{
using (var db = GetInstance())
{
SysOrganize organize = db.Queryable<SysOrganize>().Where(it => it.Id == primaryKey).First();
if (organize == null)
return 0;
organize.DeleteFlag = "Y";
return db.Updateable<SysOrganize>(organize).ExecuteCommand();
}
}
public SysOrganize Get(string primaryKey)
{
using (var db = GetInstance())
{
return db.Queryable<SysOrganize>().Where(it => it.Id == primaryKey).Includes(it => it.CreateUser).Includes(it => it.ModifyUser).First();
}
}
public int Update(SysOrganize model, string account)
{
using (var db = GetInstance())
{
model.ModifyUserId = account;
model.ModifyTime = DateTime.Now;
return db.Updateable<SysOrganize>(model).UpdateColumns(it => new
{
it.ParentId,
it.Layer,
it.EnCode,
it.FullName,
it.Type,
it.ManagerId,
it.TelePhone,
it.WeChat,
it.Fax,
it.Email,
it.Address,
it.SortCode,
it.EnableFlag,
it.Remark,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
}
}
}
}

View File

@ -0,0 +1,238 @@
using DH.RBAC.Model.Sys;
using DH.RBAC.Logic.Base;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DH.RBAC.Utility.Other;
namespace DH.RBAC.Logic.Sys
{
public class SysPermissionLogic : BaseLogic
{
public bool ActionValidate(string userId, string action)
{
List<SysPermission> authorizeModules;
if (new SysUserLogic().ContainsUser("admin", userId))
{
authorizeModules = GetList();
}
else
{
authorizeModules = GetList(userId);
}
foreach (var item in authorizeModules)
{
if (!string.IsNullOrEmpty(item.Url))
{
string[] url = item.Url.Split('?');
if (url[0].ToLower() == action.ToLower())
{
return true;
}
}
}
return false;
}
public List<SysPermission> GetList(string userId)
{
using (var db = GetInstance())
{
List<string> permissionIdList = db.Queryable<SysUserRoleRelation, SysRoleAuthorize, SysPermission>((A, B, C) => new object[] {
JoinType.Left,A.RoleId == B.RoleId,
JoinType.Left,C.Id == B.ModuleId,
})
.Where((A, B, C) => A.UserId == userId && C.EnableFlag == "Y" && B.DeleteFlag == "N")
.Select((A, B, C) => C.Id).ToList();
return db.Queryable<SysPermission>().Where(it => permissionIdList.Contains(it.Id)).OrderBy(it => it.SortCode).ToList();
}
}
public List<SysPermission> GetList(int pageIndex, int pageSize, string keyWord, ref int totalCount)
{
using (var db = GetInstance())
{
if (keyWord.IsNullOrEmpty())
{
return db.Queryable<SysPermission>().Where(it => it.DeleteFlag == "N").OrderBy(it => it.SortCode).ToPageList(pageIndex, pageSize, ref totalCount);
}
return db.Queryable<SysPermission>().Where(it => it.DeleteFlag == "N" && (it.Name.Contains(keyWord) || it.EnCode.Contains(keyWord))).OrderBy(it => it.SortCode).ToPageList(pageIndex, pageSize, ref totalCount);
}
}
public int Delete(params string[] primaryKeys)
{
using (var db = GetInstance())
{
try
{
db.BeginTran();
//删除权限与角色的对应关系。
List<SysPermission> list = db.Queryable<SysPermission>().Where(it => primaryKeys.Contains(it.Id) && it.DeleteFlag == "N").ToList();
List<string> ids = list.Select(it => it.Id).ToList();
list.ForEach(it => { it.DeleteFlag = "Y"; });
db.Updateable<SysPermission>(list).ExecuteCommand();
List<SysRoleAuthorize> list2 = db.Queryable<SysRoleAuthorize>().Where(it => ids.Contains(it.ModuleId) && it.DeleteFlag == "N").ToList();
list2.ForEach(it => { it.DeleteFlag = "Y"; });
db.Updateable<SysRoleAuthorize>(list2).ExecuteCommand();
db.CommitTran();
return 1;
}
catch (Exception ex)
{
db.RollbackTran();
return 0;
}
}
}
public int GetMaxChildMenuOrderCode(string parentId)
{
using (var db = GetInstance())
{
//得到当前节点
SysPermission permission = db.Queryable<SysPermission>().Where(it => it.Id == parentId && it.DeleteFlag == "N").First();
if (permission == null)
return 0;
//得到子的
SysPermission child = db.Queryable<SysPermission>().Where(it => it.ParentId == parentId && it.DeleteFlag == "N").OrderBy(it => it.SortCode, OrderByType.Desc).First();
if (child == null)
return permission.SortCode.Value + 100;
else
return child.SortCode.Value + 100;
}
}
public int GetChildCount(string parentId)
{
using (var db = GetInstance())
{
return db.Queryable<SysPermission>().Where(it => it.ParentId == parentId && it.DeleteFlag == "N").ToList().Count();
}
}
public List<SysPermission> GetList()
{
using (var db = GetInstance())
{
return db.Queryable<SysPermission>().Where(it => it.DeleteFlag == "N").OrderBy(it => it.SortCode).ToList();
}
}
public SysPermission Get(string primaryKey)
{
using (var db = GetInstance())
{
return db.Queryable<SysPermission>().Where(it => it.Id == primaryKey).Includes(it => it.CreateUser).Includes(it => it.ModifyUser).First();
}
}
public int Insert(SysPermission model, string account)
{
using (var db = GetInstance())
{
model.Id = UUID.StrSnowId;
model.Layer = model.Type == 2 ? 0 : model.Type == 0 ? 1 : 2;
model.IsEdit = model.IsEdit == null ? "0" : "1";
model.IsPublic = model.IsPublic == null ? "0" : "1";
model.DeleteFlag = "N";
model.EnableFlag = "Y";
model.CreateUserId = account;
model.CreateTime = DateTime.Now;
model.ModifyUserId = model.CreateUserId;
model.ModifyTime = model.CreateTime;
return db.Insertable<SysPermission>(model).ExecuteCommand();
}
}
public int AppInsert(SysPermission model, string operateUser)
{
using (var db = GetInstance())
{
model.Id = UUID.StrSnowId;
model.Layer = model.Type == 2 ? 0 : model.Type == 0 ? 1 : 2;
model.IsEdit = "1";
model.IsPublic = "0";
model.DeleteFlag = "N";
model.EnableFlag = "Y";
model.CreateUserId = operateUser;
model.CreateTime = DateTime.Now;
model.ModifyUserId = model.CreateUserId;
model.ModifyTime = model.CreateTime;
return db.Insertable<SysPermission>(model).ExecuteCommand();
}
}
public int AppUpdate(SysPermission model, string operateUser)
{
using (var db = GetInstance())
{
model.Layer = model.Type == 2 ? 0 : model.Type == 0 ? 1 : 2;
model.ModifyUserId = operateUser;
model.ModifyTime = DateTime.Now;
return db.Updateable<SysPermission>(model).UpdateColumns(it => new
{
it.ParentId,
it.Layer,
it.EnCode,
it.Name,
it.JsEvent,
it.Icon,
it.SymbolIndex,
it.Url,
it.Remark,
it.Type,
it.SortCode,
it.ModifyUserId,
it.ModifyTime,
}).ExecuteCommand();
}
}
public int Update(SysPermission model, string account)
{
using (var db = GetInstance())
{
model.Layer = model.Type == 2 ? 0 : model.Type == 0 ? 1 : 2;
model.IsEdit = model.IsEdit == null ? "0" : "1";
model.IsPublic = model.IsPublic == null ? "0" : "1";
model.ModifyUserId = account;
model.ModifyTime = DateTime.Now;
return db.Updateable<SysPermission>(model).UpdateColumns(it => new
{
it.ParentId,
it.Layer,
it.EnCode,
it.Name,
it.JsEvent,
it.Icon,
it.SymbolIndex,
it.Url,
it.Remark,
it.Type,
it.SortCode,
it.IsPublic,
it.EnableFlag,
it.IsEdit,
it.ModifyUserId,
it.ModifyTime,
}).ExecuteCommand();
}
}
public int InsertList(List<SysPermission> permissionList)
{
using (var db = GetInstance())
{
return db.Insertable<SysPermission>(permissionList).ExecuteCommand();
}
}
}
}

View File

@ -0,0 +1,170 @@
using DH.RBAC.Model.Sys;
using DH.RBAC.Logic.Base;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DH.RBAC.Utility.Other;
namespace DH.RBAC.Logic.Sys
{
public class SysRoleAuthorizeLogic : BaseLogic
{
/// <summary>
/// 获得角色权限关系
/// </summary>
/// <returns></returns>
public List<SysRoleAuthorize> GetList()
{
using (var db = GetInstance())
{
return db.Queryable<SysRoleAuthorize>().ToList();
}
}
/// <summary>
/// 根据角色ID获得角色权限关系
/// </summary>
/// <param name="roleId"></param>
/// <returns></returns>
public List<SysRoleAuthorize> GetList(string roleId)
{
using (var db = GetInstance())
{
return db.Queryable<SysRoleAuthorize>().Where(it => it.RoleId == roleId && it.DeleteFlag == "N").ToList();
}
}
/// <summary>
/// 给某个角色授权
/// </summary>
/// <param name="roleId"></param>
/// <param name="perIds"></param>
public void AppAuthorize(string operate, string roleId, params string[] perIds)
{
using (var db = GetInstance())
{
try
{
db.BeginTran();
//获得所有权限
List<SysPermission> permissionList = db.Queryable<SysPermission>().Where(it => it.DeleteFlag == "N").ToList();
List<string> perList = new List<string>();
foreach (string perId in perIds)
{
string id = perId;
while (!id.IsNullOrEmpty() && id != "0")
{
if (!perList.Contains(id))
{
perList.Add(id);
}
id = permissionList.Where(it => it.Id == id).Select(it => it.ParentId).FirstOrDefault();
}
}
//删除旧的
List<SysRoleAuthorize> list2 = db.Queryable<SysRoleAuthorize>().Where(it => it.RoleId == roleId && it.DeleteFlag == "N").ToList();
list2.ForEach(it => { it.DeleteFlag = "Y"; });
db.Updateable<SysRoleAuthorize>(list2).ExecuteCommand();
List<SysRoleAuthorize> newRoleAuthorizeList = perList.Select(it => new SysRoleAuthorize
{
Id = UUID.StrSnowId,
RoleId = roleId,
ModuleId = it,
DeleteFlag = "N",
EnableFlag = "Y",
CreateUserId = operate,
CreateTime = DateTime.Now,
ModifyUserId = operate,
ModifyTime = DateTime.Now
}).ToList();
db.Insertable<SysRoleAuthorize>(newRoleAuthorizeList).ExecuteCommand();
db.CommitTran();
}
catch
{
db.RollbackTran();
}
}
}
/// <summary>
/// 给某个角色授权
/// </summary>
/// <param name="roleId"></param>
/// <param name="perIds"></param>
public void Authorize(string roleId, string account, params string[] perIds)
{
using (var db = GetInstance())
{
try
{
db.BeginTran();
//获得所有权限
List<SysPermission> permissionList = db.Queryable<SysPermission>().ToList();
List<string> perList = new List<string>();
foreach (string perId in perIds)
{
string id = perId;
while (!id.IsNullOrEmpty() && id != "0")
{
if (!perList.Contains(id))
{
perList.Add(id);
}
id = permissionList.Where(it => it.Id == id).Select(it => it.ParentId).FirstOrDefault();
}
}
//删除旧的
List<SysRoleAuthorize> list2 = db.Queryable<SysRoleAuthorize>().Where(it => it.RoleId == roleId && it.DeleteFlag == "N").ToList();
list2.ForEach(it => { it.DeleteFlag = "Y"; });
db.Updateable<SysRoleAuthorize>(list2).ExecuteCommand();
List<SysRoleAuthorize> newRoleAuthorizeList = perList.Select(it => new SysRoleAuthorize
{
Id = UUID.StrSnowId,
RoleId = roleId,
ModuleId = it,
DeleteFlag = "N",
EnableFlag = "Y",
CreateUserId = account,
CreateTime = DateTime.Now,
ModifyUserId = account,
ModifyTime = DateTime.Now
}).ToList();
db.Insertable<SysRoleAuthorize>(newRoleAuthorizeList).ExecuteCommand();
db.CommitTran();
}
catch
{
db.RollbackTran();
}
}
}
/// <summary>
/// 从角色权限关系中删除某个模块
/// </summary>
/// <param name="moduleIds"></param>
/// <returns></returns>
public int Delete(params string[] moduleIds)
{
using (var db = GetInstance())
{
List<SysRoleAuthorize> list = db.Queryable<SysRoleAuthorize>().Where(it => moduleIds.Contains(it.ModuleId)).ToList();
list.ForEach(it => { it.DeleteFlag = "Y"; });
return db.Updateable<SysRoleAuthorize>(list).ExecuteCommand();
}
}
}
}

View File

@ -0,0 +1,176 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DH.RBAC.Model.Sys;
using DH.RBAC.Logic.Base;
using SqlSugar;
using DH.RBAC.Utility.Other;
namespace DH.RBAC.Logic.Sys
{
public class SysRoleLogic : BaseLogic
{
/// <summary>
/// 得到角色列表
/// </summary>
/// <returns></returns>
public List<SysRole> GetList()
{
using (var db = GetInstance())
{
return db.Queryable<SysRole>().Where(it => it.DeleteFlag == "N")
.Includes(it => it.Organize)
.Includes(it => it.CreateUser)
.Includes(it => it.ModifyUser)
.ToList();
}
}
/// <summary>
/// 获得角色列表分页
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="keyWord"></param>
/// <param name="totalCount"></param>
/// <returns></returns>
public List<SysRole> GetList(int pageIndex, int pageSize, string keyWord, ref int totalCount)
{
using (var db = GetInstance())
{
ISugarQueryable<SysRole> queryable = db.Queryable<SysRole>().Where(it => it.DeleteFlag == "N");
if (!keyWord.IsNullOrEmpty())
{
queryable = queryable.Where(it => (it.Name.Contains(keyWord) || it.EnCode.Contains(keyWord)));
}
return queryable.Includes(it => it.Organize)
.Includes(it => it.CreateUser)
.Includes(it => it.ModifyUser)
.OrderBy(it => it.SortCode)
.ToPageList(pageIndex, pageSize, ref totalCount);
}
}
/// <summary>
/// 新增角色
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int Insert(SysRole model, string account)
{
using (var db = GetInstance())
{
model.Id = UUID.StrSnowId;
model.AllowEdit = model.AllowEdit == null ? "0" : "1";
model.DeleteFlag = "N";
model.CreateUserId = account;
model.CreateTime = DateTime.Now;
model.ModifyUserId = model.CreateUserId;
model.ModifyTime = model.CreateTime;
return db.Insertable<SysRole>(model).ExecuteCommand();
}
}
public int AppInsert(SysRole model, string operateUser)
{
using (var db = GetInstance())
{
model.Id = UUID.StrSnowId;
model.AllowEdit = "1";
model.DeleteFlag = "N";
model.CreateUserId = operateUser;
model.CreateTime = DateTime.Now;
model.ModifyUserId = model.CreateUserId;
model.ModifyTime = model.CreateTime;
return db.Insertable<SysRole>(model).ExecuteCommand();
}
}
public int AppUpdate(SysRole model, string operateUser)
{
using (var db = GetInstance())
{
model.AllowEdit = model.AllowEdit == null ? "0" : "1";
model.ModifyUserId = operateUser;
model.ModifyTime = DateTime.Now;
return db.Updateable<SysRole>(model).UpdateColumns(it => new
{
it.OrganizeId,
it.EnCode,
it.Type,
it.Name,
it.Remark,
it.SortCode,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
}
}
/// <summary>
/// 更新角色信息
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int Update(SysRole model, string account)
{
using (var db = GetInstance())
{
model.AllowEdit = model.AllowEdit == null ? "0" : "1";
model.ModifyUserId = account;
model.ModifyTime = DateTime.Now;
return db.Updateable<SysRole>(model).UpdateColumns(it => new
{
it.OrganizeId,
it.EnCode,
it.Type,
it.Name,
it.AllowEdit,
it.EnableFlag,
it.Remark,
it.SortCode,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
}
}
/// <summary>
/// 根据主键得到角色信息
/// </summary>
/// <param name="primaryKey"></param>
/// <returns></returns>
public SysRole Get(string primaryKey)
{
using (var db = GetInstance())
{
return db.Queryable<SysRole>().Where(it => it.Id == primaryKey)
.Includes(it => it.Organize)
.Includes(it => it.CreateUser)
.Includes(it => it.ModifyUser)
.First();
}
}
/// <summary>
/// 删除角色信息
/// </summary>
/// <param name="primaryKeys"></param>
/// <returns></returns>
public int Delete(List<string> primaryKeys)
{
using (var db = GetInstance())
{
List<SysRole> list = db.Queryable<SysRole>().Where(it => primaryKeys.Contains(it.Id)).ToList();
list.ForEach(it => { it.DeleteFlag = "Y"; });
return db.Updateable<SysRole>(list).ExecuteCommand();
}
}
}
}

View File

@ -0,0 +1,175 @@
using DH.RBAC.Model.Sys;
using DH.RBAC.Logic.Base;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DH.RBAC.Utility.Other;
namespace DH.RBAC.Logic.Sys
{
public class SysUserLogOnLogic : BaseLogic
{
/// <summary>
/// 根据用户Id得到登录账号信息
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public SysUserLogOn GetByAccount(string userId)
{
using (var db = GetInstance())
{
return db.Queryable<SysUserLogOn>().Where(it => it.UserId == userId).First();
}
}
/// <summary>
/// 更新用户登录账号信息
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int UpdateLogin(SysUserLogOn model)
{
using (var db = GetInstance())
{
model.IsOnLine = "1";
model.LastVisitTime = DateTime.Now;
model.PrevVisitTime = model.LastVisitTime;
model.LoginCount += 1;
model.ModifyTime = DateTime.Now;
model.ModifyUserId = model.UserId;
return db.Updateable<SysUserLogOn>(model).UpdateColumns(it => new
{
it.IsOnLine,
it.PrevVisitTime,
it.LastVisitTime,
it.LoginCount,
it.ModifyTime,
it.ModifyUserId
}).ExecuteCommand();
}
}
/// <summary>
/// 修改密码
/// </summary>
/// <param name="userLoginEntity"></param>
/// <returns></returns>
public int ModifyPwd(SysUserLogOn userLoginEntity)
{
using (var db = GetInstance())
{
userLoginEntity.ChangePwdTime = DateTime.Now;
userLoginEntity.ModifyUserId = userLoginEntity.UserId;
userLoginEntity.ModifyTime = DateTime.Now;
return db.Updateable<SysUserLogOn>(userLoginEntity).UpdateColumns(it => new
{
it.Password,
it.ChangePwdTime,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
}
}
/// <summary>
/// 删除用户登录信息
/// </summary>
/// <param name="userIds"></param>
/// <returns></returns>
public int Delete(List<string> userIds)
{
using (var db = GetInstance())
{
List<SysUserLogOn> list = db.Queryable<SysUserLogOn>().Where(it => userIds.Contains(it.UserId)).ToList();
list.ForEach(it => { it.DeleteFlag = "Y"; });
return db.Updateable<SysUserLogOn>(list).ExecuteCommand();
}
}
/// <summary>
/// 新增用户登录账号
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int Insert(SysUserLogOn model)
{
using (var db = GetInstance())
{
model.Id = UUID.StrSnowId;
model.SecretKey = model.Id.DESEncrypt().Substring(0, 8);
model.Password = model.Password.MD5Encrypt().DESEncrypt(model.SecretKey).MD5Encrypt();
model.LoginCount = 0;
model.IsOnLine = "0";
model.EnableFlag = "Y";
model.DeleteFlag = "N";
model.CreateTime = DateTime.Now;
model.ModifyTime = DateTime.Now;
model.ModifyUserId = model.UserId;
model.CreateUserId = model.UserId;
return db.Insertable<SysUserLogOn>(model).ExecuteCommand();
}
}
/// <summary>
/// 更新用户登录账号信息
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int UpdateInfo(SysUserLogOn model)
{
using (var db = GetInstance())
{
model.ModifyTime = DateTime.Now;
model.ModifyUserId = model.UserId;
return db.Updateable<SysUserLogOn>(model).UpdateColumns(it => new
{
it.AllowMultiUserOnline,
it.Question,
it.AnswerQuestion,
it.CheckIPAddress,
it.Language,
it.Theme,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
}
}
public int UpdateTheme(SysUserLogOn model)
{
using (var db = GetInstance())
{
model.ModifyTime = DateTime.Now;
model.ModifyUserId = model.UserId;
return db.Updateable<SysUserLogOn>(model).UpdateColumns(it => new
{
it.Theme,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
}
}
public int UpdatePassword(SysUserLogOn model)
{
using (var db = GetInstance())
{
model.ModifyTime = DateTime.Now;
model.ModifyUserId = model.UserId;
return db.Updateable<SysUserLogOn>(model).UpdateColumns(it => new
{
it.Password,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
}
}
}
}

View File

@ -0,0 +1,509 @@

using DH.RBAC.Logic.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Principal;
using DH.RBAC.Model.Sys;
using DH.RBAC.Utility.Other;
using SqlSugar;
using System.ComponentModel;
namespace DH.RBAC.Logic.Sys
{
public class SysUserLogic : BaseLogic
{
/// <summary>
/// 根据账号得到用户信息
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
public SysUser GetByUserName(string account)
{
using (var db = GetInstance())
{
return db.Queryable<SysUser>().Where(it => it.Account == account && it.DeleteFlag == "N")
.Includes(it => it.Organize)
.Includes(it => it.CreateUser)
.Includes(it => it.ModifyUser)
.First();
}
}
/// <summary>
/// 修改用户基础信息
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int UpdateBasicInfo(SysUser model, string account)
{
using (var db = GetInstance())
{
model.ModifyUserId = account;
model.ModifyTime = DateTime.Now;
return db.Updateable<SysUser>(model).UpdateColumns(it => new
{
it.RealName,
it.NickName,
it.Gender,
it.Birthday,
it.MobilePhone,
it.Avatar,
it.Email,
it.Signature,
it.Address,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
}
}
public int AppUpdateBasicInfo(SysUser model)
{
using (var db = GetInstance())
{
model.ModifyUserId = model.Id;
model.ModifyTime = DateTime.Now;
return db.Updateable<SysUser>(model).UpdateColumns(it => new
{
it.RealName,
it.NickName,
it.Gender,
it.Birthday,
it.MobilePhone,
it.Avatar,
it.Email,
it.Signature,
it.Address,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
}
}
public int Insert(SysUser model, string password, string account, string[] roleIds)
{
using (var db = GetInstance())
{
try
{
db.BeginTran();
////新增用户基本信息。
model.Id = UUID.StrSnowId;
model.EnableFlag = "Y";
model.DeleteFlag = "N";
model.CreateUserId = account;
model.CreateTime = DateTime.Now;
model.ModifyUserId = model.CreateUserId;
model.ModifyTime = model.CreateTime;
model.Avatar = "/Content/framework/images/avatar.png";
int row = db.Insertable<SysUser>(model).ExecuteCommand();
if (row == 0)
{
db.RollbackTran();
return row;
}
//新增新的角色
List<SysUserRoleRelation> list = new List<SysUserRoleRelation>();
foreach (string roleId in roleIds)
{
SysUserRoleRelation roleRelation = new SysUserRoleRelation
{
Id = UUID.StrSnowId,
UserId = model.Id,
RoleId = roleId,
EnableFlag = "Y",
DeleteFlag = "N",
CreateUserId = account,
CreateTime = DateTime.Now,
ModifyUserId = account,
ModifyTime = DateTime.Now
};
list.Add(roleRelation);
}
row = db.Insertable<SysUserRoleRelation>(list).ExecuteCommand();
if (row == 0)
{
db.RollbackTran();
return row;
}
//新增用户登陆信息。
SysUserLogOn userLogOnEntity = new SysUserLogOn();
userLogOnEntity.Id = UUID.StrSnowId;
userLogOnEntity.UserId = model.Id;
userLogOnEntity.SecretKey = userLogOnEntity.Id.DESEncrypt().Substring(0, 8);
userLogOnEntity.Password = password.MD5Encrypt().DESEncrypt(userLogOnEntity.SecretKey).MD5Encrypt();
userLogOnEntity.LoginCount = 0;
userLogOnEntity.IsOnLine = "0";
userLogOnEntity.EnableFlag = "Y";
userLogOnEntity.DeleteFlag = "N";
userLogOnEntity.CreateUserId = account;
userLogOnEntity.CreateTime = DateTime.Now;
userLogOnEntity.ModifyUserId = account;
userLogOnEntity.ModifyTime = DateTime.Now;
row = db.Insertable<SysUserLogOn>(userLogOnEntity).ExecuteCommand();
if (row == 0)
{
db.RollbackTran();
return row;
}
db.CommitTran();
return row;
}
catch
{
db.RollbackTran();
return 0;
}
}
}
public bool ContainsUser(string userAccount, params string[] userIdList)
{
using (var db = GetInstance())
{
List<string> accountList = db.Queryable<SysUser>().Where(it => userIdList.Contains(it.Id)).Select(it => it.Account).ToList();
if (accountList.IsNullOrEmpty())
return false;
if (accountList.Contains(userAccount))
return true;
return false;
}
}
public int AppInsert(SysUser model, string password, string[] roleIds, string opearateUser)
{
using (var db = GetInstance())
{
try
{
db.BeginTran();
////新增用户基本信息。
model.Id = UUID.StrSnowId;
model.EnableFlag = "Y";
model.DeleteFlag = "N";
model.CreateUserId = opearateUser;
model.CreateTime = DateTime.Now;
model.ModifyUserId = model.CreateUserId;
model.ModifyTime = model.CreateTime;
model.Avatar = "/Content/framework/images/avatar.png";
int row = db.Insertable<SysUser>(model).ExecuteCommand();
if (row == 0)
{
db.RollbackTran();
return row;
}
//新增新的角色
List<SysUserRoleRelation> list = new List<SysUserRoleRelation>();
foreach (string roleId in roleIds)
{
SysUserRoleRelation roleRelation = new SysUserRoleRelation
{
Id = UUID.StrSnowId,
UserId = model.Id,
RoleId = roleId,
EnableFlag = "Y",
DeleteFlag = "N",
CreateUserId = opearateUser,
CreateTime = DateTime.Now,
ModifyUserId = opearateUser,
ModifyTime = DateTime.Now
};
list.Add(roleRelation);
}
row = db.Insertable<SysUserRoleRelation>(list).ExecuteCommand();
if (row == 0)
{
db.RollbackTran();
return row;
}
//新增用户登陆信息。
SysUserLogOn userLogOnEntity = new SysUserLogOn();
userLogOnEntity.Id = UUID.StrSnowId;
userLogOnEntity.UserId = model.Id;
userLogOnEntity.SecretKey = userLogOnEntity.Id.DESEncrypt().Substring(0, 8);
userLogOnEntity.Password = password.DESEncrypt(userLogOnEntity.SecretKey).MD5Encrypt();
userLogOnEntity.LoginCount = 0;
userLogOnEntity.IsOnLine = "0";
userLogOnEntity.EnableFlag = "Y";
userLogOnEntity.DeleteFlag = "N";
userLogOnEntity.CreateUserId = opearateUser;
userLogOnEntity.CreateTime = DateTime.Now;
userLogOnEntity.ModifyUserId = userLogOnEntity.CreateUserId;
userLogOnEntity.ModifyTime = userLogOnEntity.CreateTime;
row = db.Insertable<SysUserLogOn>(userLogOnEntity).ExecuteCommand();
if (row == 0)
{
db.RollbackTran();
return row;
}
db.CommitTran();
return row;
}
catch
{
db.RollbackTran();
return 0;
}
}
}
/// <summary>
/// 根据主键得到用户信息
/// </summary>
/// <param name="primaryKey"></param>
/// <returns></returns>
public SysUser Get(string primaryKey)
{
using (var db = GetInstance())
{
return db.Queryable<SysUser>().Where(it => it.Id == primaryKey)
.Includes(it => it.Organize)
.Includes(it => it.CreateUser)
.Includes(it => it.ModifyUser).First();
}
}
/// <summary>
/// 获得用户列表分页
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="keyWord"></param>
/// <param name="totalCount"></param>
/// <returns></returns>
public List<SysUser> GetList(int pageIndex, int pageSize, string keyWord, ref int totalCount)
{
using (var db = GetInstance())
{
ISugarQueryable<SysUser> queryable = db.Queryable<SysUser>().Where(it => it.DeleteFlag == "N");
if (!keyWord.IsNullOrEmpty())
{
queryable = queryable.Where(it => it.Account.Contains(keyWord) || it.RealName.Contains(keyWord));
}
return queryable.OrderBy(it => it.SortCode)
.Includes(it => it.Organize)
.Includes(it => it.CreateUser)
.Includes(it => it.ModifyUser).ToPageList(pageIndex, pageSize, ref totalCount);
}
}
/// <summary>
/// 删除用户信息
/// </summary>
/// <param name="primaryKeys"></param>
/// <returns></returns>
public int Delete(List<string> primaryKeys)
{
using (var db = GetInstance())
{
List<SysUser> list = db.Queryable<SysUser>().Where(it => primaryKeys.Contains(it.Id)).ToList();
list.ForEach(it => { it.DeleteFlag = "Y"; });
return db.Updateable<SysUser>(list).ExecuteCommand();
}
}
/// <summary>
/// 新增用户基础信息
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int Insert(SysUser model, string account)
{
using (var db = GetInstance())
{
model.Id = UUID.StrSnowId;
model.DeleteFlag = "N";
model.EnableFlag = "Y";
model.CreateUserId = account;
model.CreateTime = DateTime.Now;
model.ModifyUserId = model.CreateUserId;
model.ModifyTime = model.CreateTime;
model.Avatar = "/Content/framework/images/avatar.png";
return db.Insertable<SysUser>(model).ExecuteCommand();
}
}
/// <summary>
/// 更新用户基础信息
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int Update(SysUser model, string account)
{
using (var db = GetInstance())
{
model.ModifyUserId = account;
model.ModifyTime = DateTime.Now;
return db.Updateable<SysUser>(model).UpdateColumns(it => new
{
it.NickName,
it.RealName,
it.Birthday,
it.Gender,
it.Email,
it.DepartmentId,
it.RoleId,
it.MobilePhone,
it.Address,
it.Signature,
it.SortCode,
it.IsEnabled,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
}
}
public int AppUpdateAndSetRole(SysUser model, string[] roleIds, string opereateUser)
{
using (var db = GetInstance())
{
try
{
db.BeginTran();
model.ModifyUserId = opereateUser;
model.ModifyTime = DateTime.Now;
int row = db.Updateable<SysUser>(model).UpdateColumns(it => new
{
it.NickName,
it.RealName,
it.Birthday,
it.Gender,
it.Email,
it.DepartmentId,
it.RoleId,
it.MobilePhone,
it.Address,
it.Signature,
it.SortCode,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
if (row == 0)
{
db.RollbackTran();
return row;
}
//删除原来的角色
List<SysUserRoleRelation> list2 = db.Queryable<SysUserRoleRelation>().Where(it => it.UserId == model.Id && it.DeleteFlag == "N").ToList();
list2.ForEach(it => { it.DeleteFlag = "Y"; });
db.Updateable<SysUserRoleRelation>(list2).ExecuteCommand();
//新增新的角色
List<SysUserRoleRelation> list = new List<SysUserRoleRelation>();
foreach (string roleId in roleIds)
{
SysUserRoleRelation roleRelation = new SysUserRoleRelation
{
Id = UUID.StrSnowId,
UserId = model.Id,
RoleId = roleId,
DeleteFlag = "N",
EnableFlag = "Y",
CreateUserId = opereateUser,
CreateTime = DateTime.Now,
ModifyUserId = opereateUser,
ModifyTime = DateTime.Now
};
list.Add(roleRelation);
}
row = db.Insertable<SysUserRoleRelation>(list).ExecuteCommand();
if (row == 0)
{
db.RollbackTran();
return row;
}
db.CommitTran();
return row;
}
catch
{
db.RollbackTran();
return 0;
}
}
}
public int UpdateAndSetRole(SysUser model, string account, string[] roleIds)
{
using (var db = GetInstance())
{
try
{
db.BeginTran();
model.ModifyUserId = account;
model.ModifyTime = DateTime.Now;
int row = db.Updateable<SysUser>(model).UpdateColumns(it => new
{
it.NickName,
it.RealName,
it.Birthday,
it.Gender,
it.Email,
it.DepartmentId,
it.RoleId,
it.MobilePhone,
it.Address,
it.Signature,
it.SortCode,
it.EnableFlag,
it.ModifyUserId,
it.ModifyTime
}).ExecuteCommand();
if (row == 0)
{
db.RollbackTran();
return row;
}
//删除原来的角色
List<SysUserRoleRelation> list2 = db.Queryable<SysUserRoleRelation>().Where(it => it.UserId == model.Id && it.DeleteFlag == "N").ToList();
list2.ForEach(it => { it.DeleteFlag = "Y"; });
db.Updateable<SysUserRoleRelation>(list2).ExecuteCommand();
//新增新的角色
List<SysUserRoleRelation> list = new List<SysUserRoleRelation>();
foreach (string roleId in roleIds)
{
SysUserRoleRelation roleRelation = new SysUserRoleRelation
{
Id = UUID.StrSnowId,
UserId = model.Id,
RoleId = roleId,
EnableFlag = "Y",
DeleteFlag = "N",
CreateUserId = account,
CreateTime = DateTime.Now,
ModifyTime = DateTime.Now,
ModifyUserId = account
};
list.Add(roleRelation);
}
row = db.Insertable<SysUserRoleRelation>(list).ExecuteCommand();
if (row == 0)
{
db.RollbackTran();
return row;
}
db.CommitTran();
return row;
}
catch
{
db.RollbackTran();
return 0;
}
}
}
}
}

View File

@ -0,0 +1,57 @@
using DH.RBAC.Model.Sys;
using DH.RBAC.Logic.Base;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Logic.Sys
{
public class SysUserRoleRelationLogic : BaseLogic
{
/// <summary>
/// 删除用户角色关系
/// </summary>
/// <param name="userIds"></param>
/// <returns></returns>
public int Delete(List<string> userIds)
{
using (var db = GetInstance())
{
List<SysUserRoleRelation> list = db.Queryable<SysUserRoleRelation>().Where(it => userIds.Contains(it.UserId)).ToList();
list.ForEach(it => { it.DeleteFlag = "Y"; });
return db.Updateable<SysUserRoleRelation>(list).ExecuteCommand();
}
}
/// <summary>
/// 根据ID得到用户角色关系
/// </summary>
/// <param name="userIds"></param>
/// <returns></returns>
public List<SysUserRoleRelation> GetList(string userId)
{
using (var db = GetInstance())
{
return db.Queryable<SysUserRoleRelation>().Where(it => it.UserId == userId && it.DeleteFlag=="N").ToList();
}
}
/// <summary>
/// 从用户角色关系表中得到所有角色绑定信息
/// </summary>
/// <param name="ids"></param>
/// <returns></returns>
public List<SysUserRoleRelation> GetByRoles(List<string> ids)
{
using (var db = GetInstance())
{
return db.Queryable<SysUserRoleRelation>().Where(it => ids.Contains(it.RoleId) && it.DeleteFlag == "N").ToList();
}
}
}
}

View File

@ -0,0 +1,91 @@
using AntdUI;
using DH.RBAC.Model.Sys;
using SqlSugar;
using System;
using System.Text.Json.Serialization;
namespace DH.RBAC.Model
{
public class BaseModelEntity: NotifyProperty
{
/// <summary>
/// 是否启用
/// </summary>
[SugarColumn(ColumnName = "EnableFlag", ColumnDescription = "是否启用", IsNullable = true, Length = 1)]
public virtual string EnableFlag { get; set; }
/// <summary>
/// 是否删除
/// </summary>
[SugarColumn(ColumnName = "DeleteFlag", ColumnDescription = "是否删除", IsNullable = true, Length = 1)]
public virtual string DeleteFlag { get; set; }
/// <summary>
/// 创建人
/// </summary>
[SugarColumn(ColumnName = "CreateUserId", ColumnDescription = "创建人", IsNullable = true, Length = 255)]
public virtual string CreateUserId { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[SugarColumn(ColumnName = "CreateTime", ColumnDescription = "创建时间", IsNullable = true, Length = 3)]
public virtual DateTime? CreateTime { get; set; }
/// <summary>
/// 更新人
/// </summary>
[SugarColumn(ColumnName = "ModifyUserId", ColumnDescription = "更新人", IsNullable = true, Length = 255)]
public virtual string ModifyUserId { get; set; }
/// <summary>
/// 更新时间
/// </summary>
[SugarColumn(ColumnName = "ModifyTime", ColumnDescription = "更新时间", IsNullable = true, Length = 3)]
public virtual DateTime? ModifyTime { get; set; }
/// <summary>
/// 创建人
/// </summary>
[JsonIgnore]
[Navigate(NavigateType.OneToOne, nameof(CreateUserId), nameof(SysUser.Id))]//一对一 SchoolId是StudentA类里面的
public SysUser CreateUser { get; set; } //不能赋值只能是null
/// <summary>
/// 更新人
/// </summary>
[JsonIgnore]
[Navigate(NavigateType.OneToOne, nameof(ModifyUserId), nameof(SysUser.Id))]//一对一 SchoolId是StudentA类里面的
public SysUser ModifyUser { get; set; } //不能赋值只能是null
[SugarColumn(IsIgnore = true)]
public string CreateUserName
{
get
{
return CreateUser == null ? "" : CreateUser.RealName;
}
}
[SugarColumn(IsIgnore = true)]
public string ModifyUserName
{
get
{
return ModifyUser == null ? "" : ModifyUser.RealName;
}
}
[SugarColumn(IsIgnore = true)]
public bool IsDeleted
{
get
{
return DeleteFlag == "Y" ? true : false;
}
}
[SugarColumn(IsIgnore = true)]
public bool IsEnabled
{
get
{
return EnableFlag == "Y" ? true : false;
}
}
}
}

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.Base
{
public class CodeGenerator
{
public string TableName { get; set; }
public string ColumnName { get; set; }
public string TypeName { get; set; }
public string TypeLength { get; set; }
public string IsPrimaryKey { get; set; }
public string ClassName { get; set; }
public string PropertyName { get; set; }
public string CSType { get; set; }
public string Other { get; set; }
}
}

View File

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Models.Base
{
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class MenuControlAttribute : Attribute
{
public string ParentMenu { get; } // 父菜单名称(如 "相机设置"
public Type ConfigType { get; } // 配置类型(如 CameraBase
public MenuControlAttribute(string parentMenu)
{
ParentMenu = parentMenu;
}
}
}

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.DTO.Parms
{
public class AuthorParms
{
public string roleId { get; set; }
public List<string> perIds { get; set; }
public string operater { get; set; }
}
}

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.DTO.Parms
{
public class FileUploadParms
{
public byte[] file { get; set; }
public string fileName { get; set; }
}
}

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.DTO.Parms
{
public class ItemDetailIndexParms
{
public int pageIndex { get; set; }
public int pageSize { get; set; }
public string keyWord { get; set; }
public string itemId { get; set; }
}
}

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.DTO.Parms
{
public class KeyValue
{
public string Name { get; set; }
public string Value { get; set; }
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.DTO.Parms
{
public class LogDeleteParms
{
public string type { get; set; }
public string index { get; set; }
public string operateUser { get; set; }
}
}

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.DTO.Parms
{
public class LogIndexParms
{
public int pageIndex { get; set; }
public int pageSize { get; set; }
public string type { get; set; }
public string index { get; set; }
public string keyWord { get; set; }
}
}

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.DTO.Parms
{
public class LongPrimaryKeyParms
{
public string operaterId { get; set; }
public long primaryKey { get; set; }
public string operateUser { get; set; }
public string userIds { get; set; }
public string roleId { get; set; }
}
}

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.DTO.Parms
{
public class ModifyPasswordParms
{
public string userId { get; set; }
public string oldPassword { get; set; }
public string newPassword { get; set; }
public string confirmPassword { get; set; }
}
}

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.DTO.Parms
{
public class RoleDeleteParms
{
public List<string> roleIdList { get; set; }
public string operateUser { get; set; }
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.DTO.Parms
{
public class SearchParms
{
public int pageIndex { get; set; }
public int pageSize { get; set; }
public string keyWord { get; set; }
}
}

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.DTO.Parms
{
public class StrPrimaryKeyParms
{
public string operaterId { get; set; }
public string primaryKey { get; set; }
public string operateUser { get; set; }
public string userIds { get; set; }
public string roleId { get; set; }
}
}

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.DTO.Parms
{
public class UserDeleteParms
{
public List<string> userIdList { get; set; }
public string currentUserId { get; set; }
public string operateUser { get; set; }
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.DTO.Parms
{
public class UserLoginParms
{
public string verifyCode { get; set; }
public string userName { get; set; }
public string password { get; set; }
}
}

View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.Enum
{
/// <summary>
/// 权限类型。
/// </summary>
public class ModuleType
{
/// <summary>
/// 主菜单。
/// </summary>
public const int Menu = 2;
/// <summary>
/// 子菜单
/// </summary>
public const int SubMenu = 0;
/// <summary>
/// 按钮。
/// </summary>
public const int Button = 1;
}
}

View File

@ -0,0 +1,37 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.Sys
{
[SugarTable("Sys_Item")]
public partial class SysItem : BaseModelEntity
{
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true)]
public string Id { get; set; }
[SugarColumn(ColumnName = "EnCode")]
public string EnCode { get; set; }
[SugarColumn(ColumnName = "ParentId")]
public string ParentId { get; set; }
[SugarColumn(ColumnName = "Name")]
public string Name { get; set; }
[SugarColumn(ColumnName = "Layer")]
public int? Layer { get; set; }
[SugarColumn(ColumnName = "SortCode")]
public int? SortCode { get; set; }
[SugarColumn(ColumnName = "IsTree")]
public string IsTree { get; set; }
[SugarColumn(ColumnName = "Remark")]
public string Remark { get; set; }
}
}

View File

@ -0,0 +1,35 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.Sys
{
[SugarTable("Sys_ItemsDetail")]
public partial class SysItemDetail : BaseModelEntity
{
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true)]
public string Id { get; set; }
[SugarColumn(ColumnName = "ItemId")]
public string ItemId { get; set; }
[SugarColumn(ColumnName = "EnCode")]
public string EnCode { get; set; }
[SugarColumn(ColumnName = "Name")]
public string Name { get; set; }
[SugarColumn(ColumnName = "IsDefault")]
public string IsDefault { get; set; }
[SugarColumn(ColumnName = "SortCode")]
public int? SortCode { get; set; }
}
}

View File

@ -0,0 +1,29 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.Sys
{
[SugarTable("Sys_Log")]
public class SysLog : BaseModelEntity
{
[SugarColumn(IsPrimaryKey = true)]
public long Id { get; set; }
[SugarColumn]
public string Type { get; set; }
[SugarColumn]
public int ThreadId { get; set; }
[SugarColumn]
public string Message { get; set; }
[SugarColumn]
public DateTime CreateTime { get; set; }
}
}

View File

@ -0,0 +1,58 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.Sys
{
[SugarTable("Sys_Organize")]
public partial class SysOrganize : BaseModelEntity
{
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true)]
public string Id { get; set; }
[SugarColumn(ColumnName = "ParentId")]
public string ParentId { get; set; }
[SugarColumn(ColumnName = "Layer")]
public int? Layer { get; set; }
[SugarColumn(ColumnName = "EnCode")]
public string EnCode { get; set; }
[SugarColumn(ColumnName = "FullName")]
public string FullName { get; set; }
[SugarColumn(ColumnName = "Type")]
public int? Type { get; set; }
[SugarColumn(ColumnName = "ManagerId")]
public string ManagerId { get; set; }
[SugarColumn(ColumnName = "TelePhone")]
public string TelePhone { get; set; }
[SugarColumn(ColumnName = "WeChat")]
public string WeChat { get; set; }
[SugarColumn(ColumnName = "Fax")]
public string Fax { get; set; }
[SugarColumn(ColumnName = "Email")]
public string Email { get; set; }
[SugarColumn(ColumnName = "Address")]
public string Address { get; set; }
[SugarColumn(ColumnName = "SortCode")]
public int? SortCode { get; set; }
[SugarColumn(ColumnName = "Remark")]
public string Remark { get; set; }
}
}

View File

@ -0,0 +1,61 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.Sys
{
[SugarTable("Sys_Permission")]
public partial class SysPermission : BaseModelEntity
{
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true)]
public string Id { get; set; }
[SugarColumn(ColumnName = "ParentId")]
public string ParentId { get; set; }
[SugarColumn(ColumnName = "Layer")]
public int? Layer { get; set; }
[SugarColumn(ColumnName = "EnCode")]
public string EnCode { get; set; }
[SugarColumn(ColumnName = "Name")]
public string Name { get; set; }
[SugarColumn(ColumnName = "JsEvent")]
public string JsEvent { get; set; }
[SugarColumn(ColumnName = "Icon")]
public string Icon { get; set; }
[SugarColumn(ColumnName = "SymbolIndex")]
public int SymbolIndex { get; set; }
[SugarColumn(ColumnName = "Url")]
public string Url { get; set; }
[SugarColumn(ColumnName = "Remark")]
public string Remark { get; set; }
[SugarColumn(ColumnName = "Type")]
public int? Type { get; set; }
[SugarColumn(ColumnName = "SortCode")]
public int? SortCode { get; set; }
[SugarColumn(ColumnName = "IsPublic")]
public string IsPublic { get; set; }
[SugarColumn(ColumnName = "IsEdit")]
public string IsEdit { get; set; }
}
}

View File

@ -0,0 +1,55 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.Sys
{
[SugarTable("Sys_Role")]
public partial class SysRole : BaseModelEntity
{
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true)]
public string Id { get; set; }
[SugarColumn(ColumnName = "OrganizeId")]
public string OrganizeId { get; set; }
[SugarColumn(ColumnName = "EnCode")]
public string EnCode { get; set; }
[SugarColumn(ColumnName = "Type")]
public int? Type { get; set; }
[SugarColumn(ColumnName = "Name")]
public string Name { get; set; }
[SugarColumn(ColumnName = "AllowEdit")]
public string AllowEdit { get; set; }
[SugarColumn(ColumnName = "Remark")]
public string Remark { get; set; }
[SugarColumn(ColumnName = "SortCode")]
public int? SortCode { get; set; }
[Navigate(NavigateType.OneToOne, nameof(OrganizeId), nameof(SysOrganize.Id))]
public SysOrganize Organize { get; set; }
[SugarColumn(IsIgnore = true)]
public string DeptName
{
get
{
if (Organize == null)
return "";
return Organize.FullName;
}
}
}
}

View File

@ -0,0 +1,29 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.Sys
{
[SugarTable("Sys_RoleAuthorize")]
public partial class SysRoleAuthorize : BaseModelEntity
{
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true)]
public string Id { get; set; }
[SugarColumn(ColumnName = "RoleId")]
public string RoleId { get; set; }
[SugarColumn(ColumnName = "ModuleId")]
public string ModuleId { get; set; }
}
}

View File

@ -0,0 +1,115 @@

using DH.RBAC.Utility.Extension;
using DH.RBAC.Utility.Other;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.IO;
namespace DH.RBAC.Model.Sys
{
[SugarTable("Sys_User")]
public partial class SysUser : BaseModelEntity
{
private SysOrganize organize;
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true)]
public string Id { get; set; }
[SugarColumn(ColumnName = "Account")]
public string Account { get; set; }
[SugarColumn(ColumnName = "RealName")]
public string RealName { get; set; }
[SugarColumn(ColumnName = "NickName")]
public string NickName { get; set; }
[SugarColumn(ColumnName = "Avatar")]
public string Avatar { get; set; }
[SugarColumn(IsIgnore = true)]
public string AvatarBase64
{
get
{
if (Avatar.IsNullOrEmpty())
return "";
string filePath = MyEnvironment.RootPath("wwwroot" + Avatar);
if (!File.Exists(filePath))
{
return "";
}
return filePath;
}
}
[SugarColumn(ColumnName = "Gender")]
public string Gender { get; set; }
[SugarColumn(IsIgnore = true)]
public string GenderStr
{
get
{
return Gender == "1" ? "男" : "女";
}
}
[SugarColumn(ColumnName = "Birthday")]
public DateTime? Birthday { get; set; }
[SugarColumn(ColumnName = "MobilePhone")]
public string MobilePhone { get; set; }
[SugarColumn(ColumnName = "Email")]
public string Email { get; set; }
[SugarColumn(ColumnName = "Signature")]
public string Signature { get; set; }
[SugarColumn(ColumnName = "Address")]
public string Address { get; set; }
[SugarColumn(ColumnName = "CompanyId")]
public string CompanyId { get; set; }
[SugarColumn(ColumnName = "SortCode")]
public int? SortCode { get; set; }
[SugarColumn(ColumnName = "DepartmentId")]
public string DepartmentId { get; set; }
[Navigate(NavigateType.OneToOne, nameof(DepartmentId), nameof(SysOrganize.Id))]
public SysOrganize Organize { get; set; }
[SugarColumn(IsIgnore = true)]
public string DeptName
{
get
{
if (Organize == null)
return "";
return Organize.FullName;
}
}
[SugarColumn(IsIgnore = true)]
public string StrBirthday { get; set; }
[SugarColumn(IsIgnore = true)]
public List<string> RoleId { set; get; }
[SugarColumn(IsIgnore = true)]
public string password { set; get; }
[SugarColumn(IsIgnore = true)]
public string roleIds { set; get; }
}
}

View File

@ -0,0 +1,60 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.Sys
{
[SugarTable("Sys_UserLogOn")]
public partial class SysUserLogOn : BaseModelEntity
{
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true)]
public string Id { get; set; }
[SugarColumn(ColumnName = "UserId")]
public string UserId { get; set; }
[SugarColumn(ColumnName = "Password")]
public string Password { get; set; }
[SugarColumn(ColumnName = "SecretKey")]
public string SecretKey { get; set; }
[SugarColumn(ColumnName = "PrevVisitTime")]
public DateTime? PrevVisitTime { get; set; }
[SugarColumn(ColumnName = "LastVisitTime")]
public DateTime? LastVisitTime { get; set; }
[SugarColumn(ColumnName = "ChangePwdTime")]
public DateTime? ChangePwdTime { get; set; }
[SugarColumn(ColumnName = "LoginCount")]
public int LoginCount { get; set; }
[SugarColumn(ColumnName = "AllowMultiUserOnline")]
public string AllowMultiUserOnline { get; set; }
[SugarColumn(ColumnName = "IsOnLine")]
public string IsOnLine { get; set; }
[SugarColumn(ColumnName = "Question")]
public string Question { get; set; }
[SugarColumn(ColumnName = "AnswerQuestion")]
public string AnswerQuestion { get; set; }
[SugarColumn(ColumnName = "CheckIPAddress")]
public string CheckIPAddress { get; set; }
[SugarColumn(ColumnName = "Language")]
public string Language { get; set; }
[SugarColumn(ColumnName = "Theme")]
public string Theme { get; set; }
}
}

View File

@ -0,0 +1,26 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DH.RBAC.Model.Sys
{
[SugarTable("Sys_UserRoleRelation")]
public partial class SysUserRoleRelation : BaseModelEntity
{
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true)]
public string Id { get; set; }
[SugarColumn(ColumnName = "UserId")]
public string UserId { get; set; }
[SugarColumn(ColumnName = "RoleId")]
public string RoleId { get; set; }
}
}

153
DH.RBAC/Properties/Resources.Designer.cs generated Normal file
View File

@ -0,0 +1,153 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace DH.RBAC.Properties {
using System;
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(" DH.RBAC.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 重写当前线程的 CurrentUICulture 属性,对
/// 使用此强类型资源类的所有资源查找执行重写。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap avatar {
get {
object obj = ResourceManager.GetObject("avatar", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap back {
get {
object obj = ResourceManager.GetObject("back", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap background {
get {
object obj = ResourceManager.GetObject("background", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap login_back {
get {
object obj = ResourceManager.GetObject("login_back", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap logo {
get {
object obj = ResourceManager.GetObject("logo", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap logo2 {
get {
object obj = ResourceManager.GetObject("logo2", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap menu01 {
get {
object obj = ResourceManager.GetObject("menu01", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap menu02 {
get {
object obj = ResourceManager.GetObject("menu02", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap menu03 {
get {
object obj = ResourceManager.GetObject("menu03", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More