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("输出文件格式不能为空"); + } + } +}