diff --git a/src/OSharp.CodeConsoles/OSharp.CodeConsoles.csproj b/src/OSharp.CodeConsoles/OSharp.CodeConsoles.csproj
index 46c673e4fd87e419b506bd95b4e1338e99fc5c83..853fe2914cec60661a56e319ebd313e759b05523 100644
--- a/src/OSharp.CodeConsoles/OSharp.CodeConsoles.csproj
+++ b/src/OSharp.CodeConsoles/OSharp.CodeConsoles.csproj
@@ -10,7 +10,7 @@
-
+
diff --git a/src/OSharp.CodeGeneration/OSharp.CodeGeneration.csproj b/src/OSharp.CodeGeneration/OSharp.CodeGeneration.csproj
index 21b830b45854d6726957d81f73d98c04feb983d7..6751134cc7b50ad5382e09d48207b71c71ab7cd7 100644
--- a/src/OSharp.CodeGeneration/OSharp.CodeGeneration.csproj
+++ b/src/OSharp.CodeGeneration/OSharp.CodeGeneration.csproj
@@ -9,8 +9,8 @@
-
-
+
+
diff --git a/src/OSharp.CodeGeneration/Services/DataService.CodeProject.cs b/src/OSharp.CodeGeneration/Services/DataService.CodeProject.cs
index ec9d00c027810676f263c64362f47f9d850408dd..f48942bb8f7e846aa8fc5423967f639cb1c8ff20 100644
--- a/src/OSharp.CodeGeneration/Services/DataService.CodeProject.cs
+++ b/src/OSharp.CodeGeneration/Services/DataService.CodeProject.cs
@@ -82,6 +82,11 @@ namespace OSharp.CodeGeneration.Services
}
CodeProject project = dto.MapTo();
+ CodeTemplate[] templates = TemplateRepository.Query(m => m.IsSystem).OrderBy(m => m.Order).ToArray();
+ foreach (CodeTemplate template in templates)
+ {
+ project.ProjectTemplates.Add(new CodeProjectTemplate() { ProjectId = project.Id, TemplateId = template.Id });
+ }
int count = await ProjectRepository.InsertAsync(project);
if (count > 0)
{
diff --git a/src/OSharp.CodeGeneration/Services/DataService.CodeProjectTemplate.cs b/src/OSharp.CodeGeneration/Services/DataService.CodeProjectTemplate.cs
new file mode 100644
index 0000000000000000000000000000000000000000..7a2c028297d67680972c5f7d4404fdc816aba91d
--- /dev/null
+++ b/src/OSharp.CodeGeneration/Services/DataService.CodeProjectTemplate.cs
@@ -0,0 +1,114 @@
+// -----------------------------------------------------------------------
+//
+// Copyright (c) 2014-2021 OSharp. All rights reserved.
+//
+// http://www.osharp.org
+// 郭明锋
+// 2021-04-12 16:13
+// -----------------------------------------------------------------------
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Threading.Tasks;
+
+using OSharp.CodeGeneration.Services.Dtos;
+using OSharp.CodeGeneration.Services.Entities;
+using OSharp.Collections;
+using OSharp.Data;
+using OSharp.Exceptions;
+using OSharp.Extensions;
+using OSharp.Mapping;
+
+
+namespace OSharp.CodeGeneration.Services
+{
+ public partial class DataService
+ {
+ ///
+ /// 获取 项目模板信息查询数据集
+ ///
+ public IQueryable CodeProjectTemplates => ProjectTemplateRepository.QueryAsNoTracking();
+
+ ///
+ /// 检查项目模板信息信息是否存在
+ ///
+ /// 检查谓语表达式
+ /// 更新的项目模板信息编号
+ /// 项目模板信息是否存在
+ public Task CheckCodeProjectTemplateExists(Expression> predicate, Guid id = default)
+ {
+ return ProjectTemplateRepository.CheckExistsAsync(predicate, id);
+ }
+
+ ///
+ /// 更新项目模板信息信息
+ ///
+ /// 包含更新信息的项目模板信息DTO信息
+ /// 业务操作结果
+ public async Task UpdateCodeProjectTemplates(params CodeProjectTemplateInputDto[] dtos)
+ {
+ string pName = null;
+ List names = new List();
+ UnitOfWork.EnableTransaction();
+ foreach (CodeProjectTemplateInputDto dto in dtos)
+ {
+ dto.Validate();
+ CodeProject project = await ProjectRepository.GetAsync(dto.ProjectId);
+ if (project == null)
+ {
+ throw new OsharpException($"编号为“{dto.ProjectId}”的项目信息不存在");
+ }
+
+ pName ??= project.Name;
+ CodeTemplate template = await TemplateRepository.GetAsync(dto.TemplateId);
+ if (template == null)
+ {
+ throw new OsharpException($"编号为“{dto.TemplateId}”的模板信息不存在");
+ }
+
+ if (await CheckCodeProjectTemplateExists(m => m.ProjectId == dto.ProjectId && m.TemplateId == dto.TemplateId, dto.Id))
+ {
+ throw new OsharpException($"项目“{project.Name}”中模板“{template.Name}”已存在,不能重复添加");
+ }
+
+ int count = 0;
+ if (dto.Id ==default)
+ {
+ CodeProjectTemplate projectTemplate = dto.MapTo();
+ count = await ProjectTemplateRepository.InsertAsync(projectTemplate);
+ }
+ else
+ {
+ CodeProjectTemplate projectTemplate = await ProjectTemplateRepository.GetAsync(dto.Id);
+ projectTemplate = dto.MapTo(projectTemplate);
+ count = await ProjectTemplateRepository.UpdateAsync(projectTemplate);
+ }
+
+ if (count > 0)
+ {
+ names.Add(template.Name);
+ }
+ }
+
+ await UnitOfWork.CommitAsync();
+ return names.Count > 0
+ ? new OperationResult(OperationResultType.Success, $"项目“{pName}”设置模板“{names.ExpandAndToString()}”成功")
+ : OperationResult.NoChanged;
+ }
+
+ ///
+ /// 删除项目模板信息信息
+ ///
+ /// 要删除的项目模板信息编号
+ /// 业务操作结果
+ public async Task DeleteCodeProjectTemplates(params Guid[] ids)
+ {
+ UnitOfWork.EnableTransaction();
+ OperationResult result = await ProjectTemplateRepository.DeleteAsync(ids);
+ await UnitOfWork.CommitAsync();
+ return result;
+ }
+ }
+}
diff --git a/src/OSharp.CodeGeneration/Services/DataService.cs b/src/OSharp.CodeGeneration/Services/DataService.cs
index 43edae10b96129d8a5d72f11c362522b73d613bb..d3f384a9483ce093d5d3b42ed6e10c13cc3bd88f 100644
--- a/src/OSharp.CodeGeneration/Services/DataService.cs
+++ b/src/OSharp.CodeGeneration/Services/DataService.cs
@@ -30,5 +30,8 @@ namespace OSharp.CodeGeneration.Services
protected IRepository TemplateRepository => _serviceProvider.GetService>();
protected IRepository ForeignRepository => _serviceProvider.GetService>();
+
+ protected IRepository ProjectTemplateRepository =>
+ _serviceProvider.GetService>();
}
}
diff --git a/src/OSharp.CodeGeneration/Services/Dtos/CodeProjectTemplateInputDto.cs b/src/OSharp.CodeGeneration/Services/Dtos/CodeProjectTemplateInputDto.cs
new file mode 100644
index 0000000000000000000000000000000000000000..af1a084c5ecfeed62d57ff93c5666e706977f8fd
--- /dev/null
+++ b/src/OSharp.CodeGeneration/Services/Dtos/CodeProjectTemplateInputDto.cs
@@ -0,0 +1,39 @@
+// -----------------------------------------------------------------------
+//
+// Copyright (c) 2014-2021 OSharp. All rights reserved.
+//
+// http://www.osharp.org
+// 郭明锋
+// 2021-04-12 16:08
+// -----------------------------------------------------------------------
+
+using System;
+
+using OSharp.CodeGeneration.Services.Entities;
+using OSharp.Entity;
+using OSharp.Mapping;
+
+
+namespace OSharp.CodeGeneration.Services.Dtos
+{
+ [MapTo(typeof(CodeProjectTemplate))]
+ public class CodeProjectTemplateInputDto : IInputDto
+ {
+ /// 获取或设置 主键,唯一标识
+ public Guid Id { get; set; }
+
+ /// 获取或设置 是否锁定当前信息
+ public bool IsLocked { get; set; }
+
+ ///
+ /// 获取或设置 项目编号
+ ///
+ public Guid ProjectId { get; set; }
+
+ ///
+ /// 获取或设置 模板编号
+ ///
+ public Guid TemplateId { get; set; }
+
+ }
+}
diff --git a/src/OSharp.CodeGeneration/Services/Dtos/CodeTemplateInputDto.cs b/src/OSharp.CodeGeneration/Services/Dtos/CodeTemplateInputDto.cs
index 1ab9972105eee5cf53705106f4e05ced25bc214d..15803d9734f6775a3179d69b43e431839b379086 100644
--- a/src/OSharp.CodeGeneration/Services/Dtos/CodeTemplateInputDto.cs
+++ b/src/OSharp.CodeGeneration/Services/Dtos/CodeTemplateInputDto.cs
@@ -11,11 +11,14 @@ using System;
using System.ComponentModel.DataAnnotations;
using OSharp.CodeGeneration.Generates;
+using OSharp.CodeGeneration.Services.Entities;
using OSharp.Entity;
+using OSharp.Mapping;
namespace OSharp.CodeGeneration.Services.Dtos
{
+ [MapTo(typeof(CodeTemplate))]
public class CodeTemplateInputDto : IInputDto
{
/// 获取或设置 主键,唯一标识
diff --git a/src/OSharp.CodeGeneration/Services/Entities/CodeProjectTemplateConfiguration.cs b/src/OSharp.CodeGeneration/Services/Entities/CodeProjectTemplateConfiguration.cs
index 803bf05a693148d374ff9a552e75648542d36f1e..7ca050846e0dd2d6e888274ad80aa940668ca282 100644
--- a/src/OSharp.CodeGeneration/Services/Entities/CodeProjectTemplateConfiguration.cs
+++ b/src/OSharp.CodeGeneration/Services/Entities/CodeProjectTemplateConfiguration.cs
@@ -9,6 +9,7 @@
using System;
+using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using OSharp.Entity;
@@ -22,8 +23,10 @@ namespace OSharp.CodeGeneration.Services.Entities
/// 实体类型创建器
public override void Configure(EntityTypeBuilder builder)
{
- builder.HasOne(m => m.Project).WithMany(n => n.ProjectTemplates).HasForeignKey(m => m.ProjectId).IsRequired();
- builder.HasOne(m => m.Template).WithMany(n => n.ProjectTemplates).HasForeignKey(m => m.TemplateId).IsRequired();
+ builder.HasOne(m => m.Project).WithMany(n => n.ProjectTemplates).HasForeignKey(m => m.ProjectId).IsRequired()
+ .OnDelete(DeleteBehavior.Cascade);
+ builder.HasOne(m => m.Template).WithMany(n => n.ProjectTemplates).HasForeignKey(m => m.TemplateId).IsRequired()
+ .OnDelete(DeleteBehavior.Restrict);
}
}
}
diff --git a/src/OSharp.CodeGeneration/Services/IDataContract.cs b/src/OSharp.CodeGeneration/Services/IDataContract.cs
index 225cfbb441288ab538bd2868c5934aadd836f2f2..c9754595c45a25bfa3aee2d5c441816f53505bfe 100644
--- a/src/OSharp.CodeGeneration/Services/IDataContract.cs
+++ b/src/OSharp.CodeGeneration/Services/IDataContract.cs
@@ -224,6 +224,36 @@ namespace OSharp.CodeGeneration.Services
#endregion
+ #region 项目模板信息业务
+
+ ///
+ /// 获取 项目模板信息查询数据集
+ ///
+ IQueryable CodeProjectTemplates { get; }
+
+ ///
+ /// 检查项目模板信息信息是否存在
+ ///
+ /// 检查谓语表达式
+ /// 更新的项目模板信息编号
+ /// 项目模板信息是否存在
+ Task CheckCodeProjectTemplateExists(Expression> predicate, Guid id = default);
+
+ ///
+ /// 更新项目模板信息信息
+ ///
+ /// 包含更新信息的项目模板信息DTO信息
+ /// 业务操作结果
+ Task UpdateCodeProjectTemplates(params CodeProjectTemplateInputDto[] dtos);
+
+ ///
+ /// 删除项目模板信息信息
+ ///
+ /// 要删除的项目模板信息编号
+ /// 业务操作结果
+ Task DeleteCodeProjectTemplates(params Guid[] ids);
+
+ #endregion
}
}
diff --git a/src/OSharp.CodeGenerator/App.xaml.cs b/src/OSharp.CodeGenerator/App.xaml.cs
index cfb453a68b375937a8b1ee176ecd8b96e22160be..ac414af1f173e0f612fdffb89a669f072070b383 100644
--- a/src/OSharp.CodeGenerator/App.xaml.cs
+++ b/src/OSharp.CodeGenerator/App.xaml.cs
@@ -58,7 +58,6 @@ namespace OSharp.CodeGenerator
{
HandleException(msg, args.Exception);
args.Handled = true;
- Current.Shutdown();
}
catch (Exception ex)
{
diff --git a/src/OSharp.CodeGenerator/Data/AutoMapperConfiguration.cs b/src/OSharp.CodeGenerator/Data/AutoMapperConfiguration.cs
index 5fc8887173e3843ab96a534dd71453746e597b1f..93be6236d5bddca77b22a3c72a7164b55374d0b5 100644
--- a/src/OSharp.CodeGenerator/Data/AutoMapperConfiguration.cs
+++ b/src/OSharp.CodeGenerator/Data/AutoMapperConfiguration.cs
@@ -12,6 +12,7 @@ using OSharp.CodeGeneration.Services.Entities;
using OSharp.CodeGenerator.Views.Entities;
using OSharp.CodeGenerator.Views.Modules;
using OSharp.CodeGenerator.Views.Properties;
+using OSharp.CodeGenerator.Views.Templates;
namespace OSharp.CodeGenerator.Data
@@ -27,6 +28,7 @@ namespace OSharp.CodeGenerator.Data
CreateMap().ForMember(vm => vm.Module, opt => opt.Ignore());
CreateMap().ForMember(vm => vm.Entity, opt => opt.Ignore());
+
}
}
}
diff --git a/src/OSharp.CodeGenerator/Migrations/20210412164047_OnDelete1.Designer.cs b/src/OSharp.CodeGenerator/Migrations/20210412164047_OnDelete1.Designer.cs
new file mode 100644
index 0000000000000000000000000000000000000000..8fcb0820cb908dd4af27f399905ee3a485b40493
--- /dev/null
+++ b/src/OSharp.CodeGenerator/Migrations/20210412164047_OnDelete1.Designer.cs
@@ -0,0 +1,566 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using OSharp.Entity;
+
+namespace OSharp.CodeGenerator.Migrations
+{
+ [DbContext(typeof(DefaultDbContext))]
+ [Migration("20210412164047_OnDelete1")]
+ partial class OnDelete1
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "5.0.5");
+
+ modelBuilder.Entity("OSharp.Authorization.EntityInfos.EntityInfo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("AuditEnabled")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("PropertyJson")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("TypeName")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TypeName")
+ .IsUnique()
+ .HasDatabaseName("ClassFullNameIndex");
+
+ b.ToTable("Auth_EntityInfo");
+ });
+
+ modelBuilder.Entity("OSharp.Authorization.Functions.Function", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("AccessType")
+ .HasColumnType("INTEGER");
+
+ b.Property("Action")
+ .HasColumnType("TEXT");
+
+ b.Property("Area")
+ .HasColumnType("TEXT");
+
+ b.Property("AuditEntityEnabled")
+ .HasColumnType("INTEGER");
+
+ b.Property("AuditOperationEnabled")
+ .HasColumnType("INTEGER");
+
+ b.Property("CacheExpirationSeconds")
+ .HasColumnType("INTEGER");
+
+ b.Property("Controller")
+ .HasColumnType("TEXT");
+
+ b.Property("IsAccessTypeChanged")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsAjax")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsCacheSliding")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsController")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsLocked")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsSlaveDatabase")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Area", "Controller", "Action")
+ .IsUnique()
+ .HasDatabaseName("AreaControllerActionIndex");
+
+ b.ToTable("Auth_Function");
+ });
+
+ modelBuilder.Entity("OSharp.CodeGeneration.Services.Entities.CodeEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("Addable")
+ .HasColumnType("INTEGER");
+
+ b.Property("CreatedTime")
+ .HasColumnType("TEXT");
+
+ b.Property("Deletable")
+ .HasColumnType("INTEGER");
+
+ b.Property("Display")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("HasCreatedTime")
+ .HasColumnType("INTEGER");
+
+ b.Property("HasCreationAudited")
+ .HasColumnType("INTEGER");
+
+ b.Property("HasLocked")
+ .HasColumnType("INTEGER");
+
+ b.Property("HasSoftDeleted")
+ .HasColumnType("INTEGER");
+
+ b.Property("HasUpdateAudited")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsDataAuth")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsLocked")
+ .HasColumnType("INTEGER");
+
+ b.Property("Listable")
+ .HasColumnType("INTEGER");
+
+ b.Property("ModuleId")
+ .HasColumnType("TEXT");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("Order")
+ .HasColumnType("INTEGER");
+
+ b.Property("PrimaryKeyTypeFullName")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("Updatable")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ModuleId");
+
+ b.ToTable("CodeGen_CodeEntity");
+ });
+
+ modelBuilder.Entity("OSharp.CodeGeneration.Services.Entities.CodeForeign", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("DeleteBehavior")
+ .HasColumnType("INTEGER");
+
+ b.Property("EntityId")
+ .HasColumnType("TEXT");
+
+ b.Property("ForeignRelation")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsRequired")
+ .HasColumnType("INTEGER");
+
+ b.Property("OtherEntity")
+ .HasColumnType("TEXT");
+
+ b.Property("OtherNavigation")
+ .HasColumnType("TEXT");
+
+ b.Property("SelfForeignKey")
+ .HasColumnType("TEXT");
+
+ b.Property("SelfNavigation")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EntityId");
+
+ b.ToTable("CodeGen_CodeForeign");
+ });
+
+ modelBuilder.Entity("OSharp.CodeGeneration.Services.Entities.CodeModule", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedTime")
+ .HasColumnType("TEXT");
+
+ b.Property("Display")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("IsLocked")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("Order")
+ .HasColumnType("INTEGER");
+
+ b.Property("ProjectId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ProjectId");
+
+ b.ToTable("CodeGen_CodeModule");
+ });
+
+ modelBuilder.Entity("OSharp.CodeGeneration.Services.Entities.CodeProject", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("Company")
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("Copyright")
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedTime")
+ .HasColumnType("TEXT");
+
+ b.Property("Creator")
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("NamespacePrefix")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("RootPath")
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("SiteUrl")
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.ToTable("CodeGen_CodeProject");
+ });
+
+ modelBuilder.Entity("OSharp.CodeGeneration.Services.Entities.CodeProjectTemplate", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("IsLocked")
+ .HasColumnType("INTEGER");
+
+ b.Property("ProjectId")
+ .HasColumnType("TEXT");
+
+ b.Property("TemplateId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ProjectId");
+
+ b.HasIndex("TemplateId");
+
+ b.ToTable("CodeGen_CodeProjectTemplate");
+ });
+
+ modelBuilder.Entity("OSharp.CodeGeneration.Services.Entities.CodeProperty", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedTime")
+ .HasColumnType("TEXT");
+
+ b.Property("DataAuthFlag")
+ .HasColumnType("TEXT");
+
+ b.Property("DefaultValue")
+ .HasColumnType("TEXT");
+
+ b.Property("Display")
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("EntityId")
+ .HasColumnType("TEXT");
+
+ b.Property("Filterable")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsForeignKey")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsInputDto")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsLocked")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsNavigation")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsNullable")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsOutputDto")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsReadonly")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsRequired")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsVirtual")
+ .HasColumnType("INTEGER");
+
+ b.Property("MaxLength")
+ .HasColumnType("INTEGER");
+
+ b.Property("MinLength")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("Order")
+ .HasColumnType("INTEGER");
+
+ b.Property("RelateEntity")
+ .HasColumnType("TEXT");
+
+ b.Property("Sortable")
+ .HasColumnType("INTEGER");
+
+ b.Property("TypeName")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.Property("Updatable")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EntityId");
+
+ b.ToTable("CodeGen_CodeProperty");
+ });
+
+ modelBuilder.Entity("OSharp.CodeGeneration.Services.Entities.CodeTemplate", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("CreatedTime")
+ .HasColumnType("TEXT");
+
+ b.Property("IsLocked")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsOnce")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsSystem")
+ .HasColumnType("INTEGER");
+
+ b.Property("MetadataType")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(200)
+ .HasColumnType("TEXT");
+
+ b.Property("Order")
+ .HasColumnType("INTEGER");
+
+ b.Property("OutputFileFormat")
+ .IsRequired()
+ .HasMaxLength(300)
+ .HasColumnType("TEXT");
+
+ b.Property("TemplateFile")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.ToTable("CodeGen_CodeTemplate");
+ });
+
+ modelBuilder.Entity("OSharp.Core.Systems.KeyValue", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("IsLocked")
+ .HasColumnType("INTEGER");
+
+ b.Property("Key")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("ValueJson")
+ .HasColumnType("TEXT");
+
+ b.Property("ValueType")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Key")
+ .IsUnique()
+ .HasDatabaseName("KeyIndex");
+
+ b.ToTable("Systems_KeyValue");
+ });
+
+ modelBuilder.Entity("OSharp.CodeGeneration.Services.Entities.CodeEntity", b =>
+ {
+ b.HasOne("OSharp.CodeGeneration.Services.Entities.CodeModule", "Module")
+ .WithMany("Entities")
+ .HasForeignKey("ModuleId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Module");
+ });
+
+ modelBuilder.Entity("OSharp.CodeGeneration.Services.Entities.CodeForeign", b =>
+ {
+ b.HasOne("OSharp.CodeGeneration.Services.Entities.CodeEntity", "Entity")
+ .WithMany("Foreigns")
+ .HasForeignKey("EntityId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Entity");
+ });
+
+ modelBuilder.Entity("OSharp.CodeGeneration.Services.Entities.CodeModule", b =>
+ {
+ b.HasOne("OSharp.CodeGeneration.Services.Entities.CodeProject", "Project")
+ .WithMany("Modules")
+ .HasForeignKey("ProjectId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Project");
+ });
+
+ modelBuilder.Entity("OSharp.CodeGeneration.Services.Entities.CodeProjectTemplate", b =>
+ {
+ b.HasOne("OSharp.CodeGeneration.Services.Entities.CodeProject", "Project")
+ .WithMany("ProjectTemplates")
+ .HasForeignKey("ProjectId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("OSharp.CodeGeneration.Services.Entities.CodeTemplate", "Template")
+ .WithMany("ProjectTemplates")
+ .HasForeignKey("TemplateId")
+ .OnDelete(DeleteBehavior.Restrict)
+ .IsRequired();
+
+ b.Navigation("Project");
+
+ b.Navigation("Template");
+ });
+
+ modelBuilder.Entity("OSharp.CodeGeneration.Services.Entities.CodeProperty", b =>
+ {
+ b.HasOne("OSharp.CodeGeneration.Services.Entities.CodeEntity", "Entity")
+ .WithMany("Properties")
+ .HasForeignKey("EntityId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Entity");
+ });
+
+ modelBuilder.Entity("OSharp.CodeGeneration.Services.Entities.CodeEntity", b =>
+ {
+ b.Navigation("Foreigns");
+
+ b.Navigation("Properties");
+ });
+
+ modelBuilder.Entity("OSharp.CodeGeneration.Services.Entities.CodeModule", b =>
+ {
+ b.Navigation("Entities");
+ });
+
+ modelBuilder.Entity("OSharp.CodeGeneration.Services.Entities.CodeProject", b =>
+ {
+ b.Navigation("Modules");
+
+ b.Navigation("ProjectTemplates");
+ });
+
+ modelBuilder.Entity("OSharp.CodeGeneration.Services.Entities.CodeTemplate", b =>
+ {
+ b.Navigation("ProjectTemplates");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/OSharp.CodeGenerator/Migrations/20210412164047_OnDelete1.cs b/src/OSharp.CodeGenerator/Migrations/20210412164047_OnDelete1.cs
new file mode 100644
index 0000000000000000000000000000000000000000..a9a3e9d272a647aace047ae5d300f6815d91dd9c
--- /dev/null
+++ b/src/OSharp.CodeGenerator/Migrations/20210412164047_OnDelete1.cs
@@ -0,0 +1,37 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace OSharp.CodeGenerator.Migrations
+{
+ public partial class OnDelete1 : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropForeignKey(
+ name: "FK_CodeGen_CodeProjectTemplate_CodeGen_CodeTemplate_TemplateId",
+ table: "CodeGen_CodeProjectTemplate");
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_CodeGen_CodeProjectTemplate_CodeGen_CodeTemplate_TemplateId",
+ table: "CodeGen_CodeProjectTemplate",
+ column: "TemplateId",
+ principalTable: "CodeGen_CodeTemplate",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropForeignKey(
+ name: "FK_CodeGen_CodeProjectTemplate_CodeGen_CodeTemplate_TemplateId",
+ table: "CodeGen_CodeProjectTemplate");
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_CodeGen_CodeProjectTemplate_CodeGen_CodeTemplate_TemplateId",
+ table: "CodeGen_CodeProjectTemplate",
+ column: "TemplateId",
+ principalTable: "CodeGen_CodeTemplate",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ }
+ }
+}
diff --git a/src/OSharp.CodeGenerator/Migrations/DefaultDbContextModelSnapshot.cs b/src/OSharp.CodeGenerator/Migrations/DefaultDbContextModelSnapshot.cs
index 41a0393565ad65a9a259b3e9ce046e4412ae4b2e..b1bb78559dbdef4fdc8cb17af231690170b6db1e 100644
--- a/src/OSharp.CodeGenerator/Migrations/DefaultDbContextModelSnapshot.cs
+++ b/src/OSharp.CodeGenerator/Migrations/DefaultDbContextModelSnapshot.cs
@@ -516,7 +516,7 @@ namespace OSharp.CodeGenerator.Migrations
b.HasOne("OSharp.CodeGeneration.Services.Entities.CodeTemplate", "Template")
.WithMany("ProjectTemplates")
.HasForeignKey("TemplateId")
- .OnDelete(DeleteBehavior.Cascade)
+ .OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.Navigation("Project");
diff --git a/src/OSharp.CodeGenerator/OSharp.CodeGenerator.csproj b/src/OSharp.CodeGenerator/OSharp.CodeGenerator.csproj
index 5089176f9f3629fe7d5854de4749dacfcdec8ce5..79ff415333763a508eeaa4b3117b6d31d3e56601 100644
--- a/src/OSharp.CodeGenerator/OSharp.CodeGenerator.csproj
+++ b/src/OSharp.CodeGenerator/OSharp.CodeGenerator.csproj
@@ -21,8 +21,8 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
diff --git a/src/OSharp.CodeGenerator/Views/Helps/AboutView.xaml b/src/OSharp.CodeGenerator/Views/Helps/AboutView.xaml
new file mode 100644
index 0000000000000000000000000000000000000000..dda1dfd21f4f3e613268f37006d4429034238413
--- /dev/null
+++ b/src/OSharp.CodeGenerator/Views/Helps/AboutView.xaml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+ 版本号:
+
+
+
+
diff --git a/src/OSharp.CodeGenerator/Views/Helps/AboutView.xaml.cs b/src/OSharp.CodeGenerator/Views/Helps/AboutView.xaml.cs
new file mode 100644
index 0000000000000000000000000000000000000000..e778a4422ead00aed9eef38a7411e03cbc1bca8a
--- /dev/null
+++ b/src/OSharp.CodeGenerator/Views/Helps/AboutView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace OSharp.CodeGenerator.Views.Helps
+{
+ ///
+ /// AboutView.xaml 的交互逻辑
+ ///
+ public partial class AboutView : UserControl
+ {
+ public AboutView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/src/OSharp.CodeGenerator/Views/Helps/AboutViewModel.cs b/src/OSharp.CodeGenerator/Views/Helps/AboutViewModel.cs
new file mode 100644
index 0000000000000000000000000000000000000000..10bc234ce261ffc754b4561af041f2ff113f3355
--- /dev/null
+++ b/src/OSharp.CodeGenerator/Views/Helps/AboutViewModel.cs
@@ -0,0 +1,34 @@
+// -----------------------------------------------------------------------
+//
+// Copyright (c) 2014-2021 OSharp. All rights reserved.
+//
+// http://www.osharp.org
+// 郭明锋
+// 2021-04-12 14:37
+// -----------------------------------------------------------------------
+
+using System.Reflection;
+
+using OSharp.Filter;
+using OSharp.IO;
+using OSharp.Reflection;
+using OSharp.Wpf.Stylet;
+
+using Stylet;
+
+
+namespace OSharp.CodeGenerator.Views.Helps
+{
+ [Singleton]
+ public class AboutViewModel : Screen
+ {
+ public AboutViewModel()
+ {
+ Version = Assembly.GetExecutingAssembly().GetProductVersion();
+ }
+
+ public bool IsShow { get; set; }
+
+ public string Version { get; set; }
+ }
+}
diff --git a/src/OSharp.CodeGenerator/Views/MainMenuView.xaml b/src/OSharp.CodeGenerator/Views/MainMenuView.xaml
index b82d35aa168f53e20be029d19dd6a65870f12af0..1dbb04ebed8f3dba12ffdbcf012434bb2e339786 100644
--- a/src/OSharp.CodeGenerator/Views/MainMenuView.xaml
+++ b/src/OSharp.CodeGenerator/Views/MainMenuView.xaml
@@ -65,6 +65,7 @@
+
diff --git a/src/OSharp.CodeGenerator/Views/MainMenuViewModel.cs b/src/OSharp.CodeGenerator/Views/MainMenuViewModel.cs
index 9809c41fb2699c653763d6592f927495eea5e658..1bd33dcac2331d634ba52b3c11706d41161ccfa0 100644
--- a/src/OSharp.CodeGenerator/Views/MainMenuViewModel.cs
+++ b/src/OSharp.CodeGenerator/Views/MainMenuViewModel.cs
@@ -8,10 +8,14 @@
// -----------------------------------------------------------------------
using System;
+using System.Diagnostics;
using System.Windows;
+using OSharp.CodeGenerator.Views.Helps;
using OSharp.CodeGenerator.Views.Projects;
+using OSharp.CodeGenerator.Views.Templates;
using OSharp.Wpf.Stylet;
+using OSharp.Wpf.Utilities;
using Stylet;
@@ -66,15 +70,12 @@ namespace OSharp.CodeGenerator.Views
ProjectListViewModel model = IoC.Get();
model.Show();
}
-
- public void Module()
- {
-
- }
-
+
public void Template()
{
-
+ ProjectTemplateListViewModel model = IoC.Get();
+ model.IsShow = true;
+ model.Init();
}
#endregion
@@ -83,7 +84,9 @@ namespace OSharp.CodeGenerator.Views
public void GlobalTemplate()
{
-
+ TemplateListViewModel model = IoC.Get();
+ model.IsShow = true;
+ model.Init();
}
#endregion
@@ -92,12 +95,20 @@ namespace OSharp.CodeGenerator.Views
public void Github()
{
-
+ const string url = "https://github.com/dotnetcore/osharp";
+ PublicUtils.OpenUrl2(url);
+ }
+
+ public void Gitee()
+ {
+ const string url = "https://gitee.com/i66soft/OSharp.CodeGenerator";
+ PublicUtils.OpenUrl2(url);
}
public void About()
{
-
+ AboutViewModel about = IoC.Get();
+ about.IsShow = true;
}
#endregion
diff --git a/src/OSharp.CodeGenerator/Views/MainView.xaml b/src/OSharp.CodeGenerator/Views/MainView.xaml
index 64b5d8dd67ab4db0e1c7268a11f3a3ba868844f4..57f6a42d0a9faf37317986515b830adfb3da4365 100644
--- a/src/OSharp.CodeGenerator/Views/MainView.xaml
+++ b/src/OSharp.CodeGenerator/Views/MainView.xaml
@@ -10,6 +10,8 @@
xmlns:viewsModules="clr-namespace:OSharp.CodeGenerator.Views.Modules"
xmlns:viewsEntities="clr-namespace:OSharp.CodeGenerator.Views.Entities"
xmlns:viewsProperties="clr-namespace:OSharp.CodeGenerator.Views.Properties"
+ xmlns:viewsTemplates="clr-namespace:OSharp.CodeGenerator.Views.Templates"
+ xmlns:viewsHelps="clr-namespace:OSharp.CodeGenerator.Views.Helps"
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
xmlns:mahwin="http://metro.mahapps.com/winfx/xaml/simplechildwindow"
xmlns:icons="http://metro.mahapps.com/winfx/xaml/iconpacks"
@@ -43,6 +45,9 @@
+
+
+
diff --git a/src/OSharp.CodeGenerator/Views/MainViewModel.cs b/src/OSharp.CodeGenerator/Views/MainViewModel.cs
index de5c918d91d6c00db4b1114cb8269d5118c6fc7f..2e96e6328862fa0b8e54199c58fb126d6c66e4b7 100644
--- a/src/OSharp.CodeGenerator/Views/MainViewModel.cs
+++ b/src/OSharp.CodeGenerator/Views/MainViewModel.cs
@@ -13,9 +13,11 @@ using Notifications.Wpf.Core;
using Notifications.Wpf.Core.Controls;
using OSharp.CodeGenerator.Views.Entities;
+using OSharp.CodeGenerator.Views.Helps;
using OSharp.CodeGenerator.Views.Modules;
using OSharp.CodeGenerator.Views.Projects;
using OSharp.CodeGenerator.Views.Properties;
+using OSharp.CodeGenerator.Views.Templates;
using OSharp.Wpf.Stylet;
using Stylet;
@@ -51,6 +53,12 @@ namespace OSharp.CodeGenerator.Views
public PropertyListViewModel PropertyList { get; set; } = IoC.Get();
+ public TemplateListViewModel TemplateList { get; set; } = IoC.Get();
+
+ public ProjectTemplateListViewModel ProjectTemplateList { get; set; } = IoC.Get();
+
+ public AboutViewModel About { get; set; } = IoC.Get();
+
public async Task Notify(string message, NotificationType type = NotificationType.Information, string title = "消息提示")
{
NotificationContent content = new NotificationContent()
diff --git a/src/OSharp.CodeGenerator/Views/Modules/ModuleListViewModel.cs b/src/OSharp.CodeGenerator/Views/Modules/ModuleListViewModel.cs
index b074b7ad3486dfd0802864cc0749aee9d07a6e57..5d730086442a473e4145bd37e87d94141407c1be 100644
--- a/src/OSharp.CodeGenerator/Views/Modules/ModuleListViewModel.cs
+++ b/src/OSharp.CodeGenerator/Views/Modules/ModuleListViewModel.cs
@@ -22,7 +22,6 @@ using OSharp.CodeGeneration.Services.Entities;
using OSharp.CodeGenerator.Data;
using OSharp.CodeGenerator.Views.Projects;
using OSharp.Data;
-using OSharp.Exceptions;
using OSharp.Mapping;
using OSharp.Wpf.Stylet;
diff --git a/src/OSharp.CodeGenerator/Views/Modules/ModuleViewModel.cs b/src/OSharp.CodeGenerator/Views/Modules/ModuleViewModel.cs
index ffa92e8145706cc0e079307884baf6c68a9ebdc5..def3027e57ebb4bbd6f7c41d20ad1a3104420ee9 100644
--- a/src/OSharp.CodeGenerator/Views/Modules/ModuleViewModel.cs
+++ b/src/OSharp.CodeGenerator/Views/Modules/ModuleViewModel.cs
@@ -33,11 +33,9 @@ namespace OSharp.CodeGenerator.Views.Modules
public class ModuleViewModel : Screen
{
private readonly IServiceProvider _provider;
-
- ///
- /// 初始化一个类型的新实例
- ///
- public ModuleViewModel(IModelValidator validator, IServiceProvider provider) : base(validator)
+
+ public ModuleViewModel(IModelValidator validator, IServiceProvider provider)
+ : base(validator)
{
_provider = provider;
Validate();
@@ -72,14 +70,14 @@ namespace OSharp.CodeGenerator.Views.Modules
IDataContract contract = provider.GetRequiredService();
result = await contract.DeleteCodeModules(Id);
});
- MainViewModel main = IoC.Get();
Helper.Notify(result);
if (!result.Succeeded)
{
return;
}
- main.ModuleList.Init();
+ ModuleListViewModel list = IoC.Get();
+ list.Init();
}
}
diff --git a/src/OSharp.CodeGenerator/Views/Projects/ProjectListViewModel.cs b/src/OSharp.CodeGenerator/Views/Projects/ProjectListViewModel.cs
index e56c1b160b2f1173112a92292e514a8cccd030b7..dc45896284203c002d3136143d48d6bd18825efb 100644
--- a/src/OSharp.CodeGenerator/Views/Projects/ProjectListViewModel.cs
+++ b/src/OSharp.CodeGenerator/Views/Projects/ProjectListViewModel.cs
@@ -50,16 +50,15 @@ namespace OSharp.CodeGenerator.Views.Projects
IsShow = true;
}
- public async void Init()
+ public void Init()
{
List projects = new List();
- await _provider.ExecuteScopedWork(provider =>
+ _provider.ExecuteScopedWork(provider =>
{
- Projects.Clear();
IDataContract contract = provider.GetRequiredService();
projects = contract.CodeProjects.ToList();
- return Task.CompletedTask;
});
+ Projects.Clear();
foreach (CodeProject project in projects)
{
ProjectViewModel model = _provider.GetRequiredService();
@@ -76,5 +75,5 @@ namespace OSharp.CodeGenerator.Views.Projects
model.IsShowEdit = true;
}
}
-
+
}
diff --git a/src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateListView.xaml b/src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateListView.xaml
new file mode 100644
index 0000000000000000000000000000000000000000..3d193eb24ba1eb42a6087e4403152130f0a3bd10
--- /dev/null
+++ b/src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateListView.xaml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+ 项目模板列表
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateListView.xaml.cs b/src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateListView.xaml.cs
new file mode 100644
index 0000000000000000000000000000000000000000..d12aef125d961c0ea72b20ac1d3f85c15949c41b
--- /dev/null
+++ b/src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateListView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace OSharp.CodeGenerator.Views.Projects
+{
+ ///
+ /// ProjectTemplateListView.xaml 的交互逻辑
+ ///
+ public partial class ProjectTemplateListView : UserControl
+ {
+ public ProjectTemplateListView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateListViewModel.cs b/src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateListViewModel.cs
new file mode 100644
index 0000000000000000000000000000000000000000..85795cb52ebbce729f61b031059cccbf99bfba81
--- /dev/null
+++ b/src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateListViewModel.cs
@@ -0,0 +1,151 @@
+// -----------------------------------------------------------------------
+//
+// Copyright (c) 2014-2021 OSharp. All rights reserved.
+//
+// http://www.osharp.org
+// 郭明锋
+// 2021-04-12 20:02
+// -----------------------------------------------------------------------
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Controls;
+
+using Microsoft.Extensions.DependencyInjection;
+
+using Notifications.Wpf.Core;
+
+using OSharp.CodeGeneration.Services;
+using OSharp.CodeGeneration.Services.Dtos;
+using OSharp.CodeGeneration.Services.Entities;
+using OSharp.CodeGenerator.Data;
+using OSharp.CodeGenerator.Views.Templates;
+using OSharp.Data;
+using OSharp.Mapping;
+using OSharp.Wpf.Stylet;
+
+using Stylet;
+
+
+namespace OSharp.CodeGenerator.Views.Projects
+{
+ [Singleton]
+ public class ProjectTemplateListViewModel : Screen
+ {
+ private readonly IServiceProvider _provider;
+
+ public ProjectTemplateListViewModel(IServiceProvider provider)
+ {
+ _provider = provider;
+ }
+
+ public ProjectViewModel Project { get; set; }
+
+ public string Title { get; set; }
+
+ public IObservableCollection ProjectTemplates { get; set; } = new BindableCollection();
+
+ public bool IsShow { get; set; }
+
+ public IObservableCollection TemplateSource { get; set; } = new BindableCollection();
+
+ public void Init()
+ {
+ if (Project == null)
+ {
+ Helper.Notify("当前项目为空,请先通过菜单“项目-项目管理”加载项目", NotificationType.Error);
+ return;
+ }
+ ProjectTemplateViewModel[] models = new ProjectTemplateViewModel[0];
+ _provider.ExecuteScopedWork(provider =>
+ {
+ IDataContract contract = provider.GetRequiredService();
+ models = contract.CodeProjectTemplates.Where(m => m.ProjectId == Project.Id).Select(m => new ProjectTemplateViewModel(_provider)
+ {
+ Id = m.Id,
+ ProjectId = m.ProjectId,
+ TemplateId = m.TemplateId,
+ IsLocked = m.IsLocked,
+ TemplateName = m.Template.Name
+ }).ToArray();
+ });
+ ProjectTemplates.Clear();
+ foreach (ProjectTemplateViewModel model in models)
+ {
+ ProjectTemplates.Add(model);
+ }
+ }
+
+ public void New()
+ {
+ ProjectTemplateViewModel model = IoC.Get();
+ model.ProjectId = Project.Id;
+ model.TemplateSource = GetTemplates(Project.Id);
+ ProjectTemplates.Add(model);
+ }
+
+ private BindableCollection GetTemplates(Guid projectId)
+ {
+ CodeTemplate[] templates = new CodeTemplate[0];
+ _provider.ExecuteScopedWork(provider =>
+ {
+ IDataContract contract = provider.GetRequiredService();
+ Guid[] existIds = contract.CodeProjectTemplates.Where(m => m.ProjectId == projectId).Select(m => m.TemplateId).ToArray();
+ templates = contract.CodeTemplates.Where(m => !existIds.Contains(m.Id)).ToArray();
+ });
+ BindableCollection models = new BindableCollection();
+ foreach (CodeTemplate template in templates)
+ {
+ TemplateViewModel model = _provider.GetRequiredService();
+ model = template.MapTo(model);
+ models.Add(model);
+ }
+
+ return models;
+ }
+
+ public bool CanSave => ProjectTemplates.All(m => !m.HasErrors);
+ public async void Save()
+ {
+ if (!CanSave)
+ {
+ Helper.Notify("项目模板验证失败", NotificationType.Warning);
+ return;
+ }
+
+ CodeProjectTemplateInputDto[] dtos = ProjectTemplates.Select(m => m.MapTo()).ToArray();
+ OperationResult result = null;
+ await _provider.ExecuteScopedWorkAsync(async provider =>
+ {
+ IDataContract contract = provider.GetRequiredService();
+ result = await contract.UpdateCodeProjectTemplates(dtos);
+ });
+ Helper.Notify(result);
+ if (!result.Succeeded)
+ {
+ return;
+ }
+
+ Init();
+ }
+
+ ///
+ /// Called whenever the error state of any properties changes. Calls NotifyOfPropertyChange("HasErrors") by default
+ ///
+ /// List of property names which have changed validation state
+ protected override void OnValidationStateChanged(IEnumerable changedProperties)
+ {
+ base.OnValidationStateChanged(changedProperties);
+ NotifyOfPropertyChange(() => CanSave);
+ }
+
+ public void BeginningEdit(DataGridBeginningEditEventArgs args)
+ {
+ if (args.Row.DataContext is ProjectTemplateViewModel model)
+ {
+ model.TemplateSource = GetTemplates(model.ProjectId);
+ }
+ }
+ }
+}
diff --git a/src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateViewModel.cs b/src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateViewModel.cs
new file mode 100644
index 0000000000000000000000000000000000000000..c5bbc8176dd45bb614ebb18a51639ff5521959da
--- /dev/null
+++ b/src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateViewModel.cs
@@ -0,0 +1,87 @@
+// -----------------------------------------------------------------------
+//
+// Copyright (c) 2014-2021 OSharp. All rights reserved.
+//
+// http://www.osharp.org
+// 郭明锋
+// 2021-04-12 20:02
+// -----------------------------------------------------------------------
+
+using System;
+using System.Linq;
+using System.Windows;
+using System.Windows.Controls;
+
+using Microsoft.Extensions.DependencyInjection;
+
+using OSharp.CodeGeneration.Services;
+using OSharp.CodeGeneration.Services.Dtos;
+using OSharp.CodeGeneration.Services.Entities;
+using OSharp.CodeGenerator.Data;
+using OSharp.CodeGenerator.Views.Templates;
+using OSharp.Data;
+using OSharp.Mapping;
+using OSharp.Wpf.Stylet;
+
+using Stylet;
+
+
+namespace OSharp.CodeGenerator.Views.Projects
+{
+ [MapTo(typeof(CodeProjectTemplateInputDto))]
+ public class ProjectTemplateViewModel : Screen
+ {
+ private readonly IServiceProvider _provider;
+
+ public ProjectTemplateViewModel(IServiceProvider provider)
+ {
+ _provider = provider;
+ }
+
+ public Guid Id { get; set; }
+
+ public bool IsLocked { get; set; }
+
+ public Guid ProjectId { get; set; }
+
+ public Guid TemplateId { get; set; }
+
+ public string TemplateName { get; set; }
+
+ public TemplateViewModel Template { get; set; }
+
+ public IObservableCollection TemplateSource { get; set; } = new BindableCollection();
+
+ public void TemplateChange(SelectionChangedEventArgs args)
+ {
+ if (args.AddedItems.Count > 0 && args.AddedItems[0] is TemplateViewModel template)
+ {
+ TemplateId = template.Id;
+ TemplateName = template.Name;
+ }
+ }
+
+ public async void Delete()
+ {
+ if (MessageBox.Show($"是否删除模板“[{TemplateName}]”?", "请确认", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)
+ {
+ return;
+ }
+
+ OperationResult result = null;
+ await _provider.ExecuteScopedWorkAsync(async provider =>
+ {
+ IDataContract contract = provider.GetRequiredService();
+ result = await contract.DeleteCodeProjectTemplates(Id);
+ });
+ Helper.Notify(result);
+ if (!result.Succeeded)
+ {
+ return;
+ }
+
+ ProjectTemplateListViewModel list = IoC.Get();
+ list.Init();
+ }
+ }
+}
diff --git a/src/OSharp.CodeGenerator/Views/Projects/ProjectViewModel.cs b/src/OSharp.CodeGenerator/Views/Projects/ProjectViewModel.cs
index f48a350ca190d7039b8129ec7c3c1b5b99ae00a4..608dac01d367d75b54cf7eb529efc6136e4edc72 100644
--- a/src/OSharp.CodeGenerator/Views/Projects/ProjectViewModel.cs
+++ b/src/OSharp.CodeGenerator/Views/Projects/ProjectViewModel.cs
@@ -73,6 +73,9 @@ namespace OSharp.CodeGenerator.Views.Projects
MenuViewModel menu = IoC.Get();
menu.Project = this;
menu.Init();
+ ProjectTemplateListViewModel projectTemplateList = IoC.Get();
+ projectTemplateList.Project = this;
+ projectTemplateList.Title = $"模块“{Name}[{NamespacePrefix}]”模块管理";
main.ProjectList.IsShow = false;
main.StatusBar.Message = $"项目“{Name}”加载成功";
}
diff --git a/src/OSharp.CodeGenerator/Views/Templates/TemplateListView.xaml b/src/OSharp.CodeGenerator/Views/Templates/TemplateListView.xaml
new file mode 100644
index 0000000000000000000000000000000000000000..05f502ff5dfc044a269f57bbd0904d69b8d2623c
--- /dev/null
+++ b/src/OSharp.CodeGenerator/Views/Templates/TemplateListView.xaml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+ 全局模板列表
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/OSharp.CodeGenerator/Views/Templates/TemplateListView.xaml.cs b/src/OSharp.CodeGenerator/Views/Templates/TemplateListView.xaml.cs
new file mode 100644
index 0000000000000000000000000000000000000000..026a2b38413e851d1db53d637d98fa6d7ba6f1e3
--- /dev/null
+++ b/src/OSharp.CodeGenerator/Views/Templates/TemplateListView.xaml.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace OSharp.CodeGenerator.Views.Templates
+{
+ ///
+ /// TemplateListView.xaml 的交互逻辑
+ ///
+ public partial class TemplateListView : UserControl
+ {
+ public TemplateListView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/src/OSharp.CodeGenerator/Views/Templates/TemplateListViewModel.cs b/src/OSharp.CodeGenerator/Views/Templates/TemplateListViewModel.cs
new file mode 100644
index 0000000000000000000000000000000000000000..89f93be1bc71a60e8d3445a6d555bdf1f8498cd1
--- /dev/null
+++ b/src/OSharp.CodeGenerator/Views/Templates/TemplateListViewModel.cs
@@ -0,0 +1,110 @@
+// -----------------------------------------------------------------------
+//
+// Copyright (c) 2014-2021 OSharp. All rights reserved.
+//
+// http://www.osharp.org
+// 郭明锋
+// 2021-04-12 15:41
+// -----------------------------------------------------------------------
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+using Microsoft.Extensions.DependencyInjection;
+
+using Notifications.Wpf.Core;
+
+using OSharp.CodeGeneration.Services;
+using OSharp.CodeGeneration.Services.Dtos;
+using OSharp.CodeGeneration.Services.Entities;
+using OSharp.CodeGenerator.Data;
+using OSharp.Data;
+using OSharp.Entity;
+using OSharp.Mapping;
+using OSharp.Wpf.Stylet;
+
+using Stylet;
+
+
+namespace OSharp.CodeGenerator.Views.Templates
+{
+ [Singleton]
+ public class TemplateListViewModel : Screen
+ {
+ private readonly IServiceProvider _provider;
+
+ public TemplateListViewModel(IServiceProvider provider)
+ {
+ _provider = provider;
+ }
+
+ public bool IsShow { get; set; }
+
+ public IObservableCollection Templates { get; set; } = new BindableCollection();
+
+ public void Init()
+ {
+ CodeTemplate[] templates = new CodeTemplate[0];
+ _provider.ExecuteScopedWork(provider =>
+ {
+ IDataContract contract = provider.GetRequiredService();
+ templates = contract.CodeTemplates.OrderBy(m => !m.IsSystem).ThenBy(m => m.Order).ToArray();
+ });
+ Templates.Clear();
+ foreach (CodeTemplate template in templates)
+ {
+ TemplateViewModel model = _provider.GetRequiredService();
+ model = template.MapTo(model);
+ Templates.Add(model);
+ }
+ }
+
+ public void New()
+ {
+ TemplateViewModel model = IoC.Get();
+ Templates.Add(model);
+ }
+
+ public bool CanSave => Templates.All(m => !m.HasErrors);
+ public async void Save()
+ {
+ if (!CanSave)
+ {
+ Helper.Notify("模板信息验证失败", NotificationType.Warning);
+ return;
+ }
+
+ for (int i = 0; i < Templates.Count; i++)
+ {
+ Templates[i].Order = i + 1;
+ }
+
+ CodeTemplateInputDto[] dtos = Templates.Select(m => m.MapTo()).ToArray();
+ OperationResult result = null;
+ await _provider.ExecuteScopedWorkAsync(async provider =>
+ {
+ IDataContract contract = provider.GetRequiredService();
+ result = await contract.UpdateCodeTemplates(dtos);
+ });
+ Helper.Notify(result);
+ if (!result.Succeeded)
+ {
+ return;
+ }
+
+ Init();
+ }
+
+ ///
+ /// Called whenever the error state of any properties changes. Calls NotifyOfPropertyChange("HasErrors") by default
+ ///
+ /// List of property names which have changed validation state
+ protected override void OnValidationStateChanged(IEnumerable changedProperties)
+ {
+ base.OnValidationStateChanged(changedProperties);
+ NotifyOfPropertyChange(() => CanSave);
+ }
+ }
+}
diff --git a/src/OSharp.CodeGenerator/Views/Templates/TemplateViewModel.cs b/src/OSharp.CodeGenerator/Views/Templates/TemplateViewModel.cs
new file mode 100644
index 0000000000000000000000000000000000000000..09d82e3ecaa49a8458f4e0379381d970eec04cd6
--- /dev/null
+++ b/src/OSharp.CodeGenerator/Views/Templates/TemplateViewModel.cs
@@ -0,0 +1,106 @@
+// -----------------------------------------------------------------------
+//
+// Copyright (c) 2014-2021 OSharp. All rights reserved.
+//
+// http://www.osharp.org
+// 郭明锋
+// 2021-04-12 15:42
+// -----------------------------------------------------------------------
+
+using System;
+using System.Windows;
+
+using FluentValidation;
+
+using Microsoft.Extensions.DependencyInjection;
+
+using Notifications.Wpf.Core;
+
+using OSharp.CodeGeneration.Generates;
+using OSharp.CodeGeneration.Services;
+using OSharp.CodeGeneration.Services.Dtos;
+using OSharp.CodeGeneration.Services.Entities;
+using OSharp.CodeGenerator.Data;
+using OSharp.Data;
+using OSharp.Mapping;
+using OSharp.Wpf.Stylet;
+
+using Stylet;
+
+
+namespace OSharp.CodeGenerator.Views.Templates
+{
+ [MapTo(typeof(CodeTemplateInputDto))]
+ [MapFrom(typeof(CodeTemplate))]
+ public class TemplateViewModel : Screen
+ {
+ private readonly IServiceProvider _provider;
+
+ public TemplateViewModel(IModelValidator validator, IServiceProvider provider)
+ : base(validator)
+ {
+ _provider = provider;
+ Validate();
+ }
+
+ public Guid Id { get; set; }
+
+ public string Name { get; set; }
+
+ public MetadataType MetadataType { get; set; }
+
+ public string TemplateFile { get; set; }
+
+ public int Order { get; set; }
+
+ public string OutputFileFormat { get; set; }
+
+ public bool IsOnce { get; set; }
+
+ public bool IsSystem { get; set; }
+
+ public bool IsLocked { get; set; }
+
+ public DateTime CreatedTime { get; set; }
+
+ public async void Delete()
+ {
+ if (IsSystem)
+ {
+ Helper.Notify($"模板“{Name}”是系统模板,不能删除", NotificationType.Error);
+ return;
+ }
+
+ if (MessageBox.Show($"是否删除模板“{Name}”?", "请确认", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)
+ {
+ return;
+ }
+
+ OperationResult result = null;
+ await _provider.ExecuteScopedWorkAsync(async provider =>
+ {
+ IDataContract contract = provider.GetRequiredService();
+ result = await contract.DeleteCodeTemplates(Id);
+ });
+ Helper.Notify(result);
+ if (!result.Succeeded)
+ {
+ return;
+ }
+
+ TemplateListViewModel list = IoC.Get();
+ list.Init();
+ }
+ }
+
+
+ public class TemplateViewModelValidator : AbstractValidator
+ {
+ public TemplateViewModelValidator()
+ {
+ RuleFor(m => m.Name).NotEmpty().WithMessage("模块名称不能为空");
+ RuleFor(m => m.TemplateFile).NotEmpty().WithMessage("源代码文件不能为空");
+ RuleFor(m => m.OutputFileFormat).NotEmpty().WithMessage("输出文件格式不能为空");
+ }
+ }
+}