From 93bab9c1d1873577fda204f6f03fd697e3e8c09c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E6=98=8E=E9=94=8B?= Date: Mon, 12 Apr 2021 15:38:13 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=85=B3=E4=BA=8E?= =?UTF-8?q?=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OSharp.CodeConsoles.csproj | 2 +- .../OSharp.CodeGeneration.csproj | 4 +-- src/OSharp.CodeGenerator/App.xaml.cs | 1 - .../OSharp.CodeGenerator.csproj | 4 +-- .../Views/Helps/AboutView.xaml | 24 +++++++++++++ .../Views/Helps/AboutView.xaml.cs | 28 +++++++++++++++ .../Views/Helps/AboutViewModel.cs | 34 +++++++++++++++++++ .../Views/MainMenuView.xaml | 1 + .../Views/MainMenuViewModel.cs | 15 ++++++-- src/OSharp.CodeGenerator/Views/MainView.xaml | 2 ++ .../Views/MainViewModel.cs | 3 ++ 11 files changed, 110 insertions(+), 8 deletions(-) create mode 100644 src/OSharp.CodeGenerator/Views/Helps/AboutView.xaml create mode 100644 src/OSharp.CodeGenerator/Views/Helps/AboutView.xaml.cs create mode 100644 src/OSharp.CodeGenerator/Views/Helps/AboutViewModel.cs diff --git a/src/OSharp.CodeConsoles/OSharp.CodeConsoles.csproj b/src/OSharp.CodeConsoles/OSharp.CodeConsoles.csproj index 46c673e..853fe29 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 21b830b..6751134 100644 --- a/src/OSharp.CodeGeneration/OSharp.CodeGeneration.csproj +++ b/src/OSharp.CodeGeneration/OSharp.CodeGeneration.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/src/OSharp.CodeGenerator/App.xaml.cs b/src/OSharp.CodeGenerator/App.xaml.cs index cfb453a..ac414af 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/OSharp.CodeGenerator.csproj b/src/OSharp.CodeGenerator/OSharp.CodeGenerator.csproj index 5089176..79ff415 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 0000000..dda1dfd --- /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 0000000..e778a44 --- /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 0000000..10bc234 --- /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 b82d35a..1dbb04e 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 9809c41..12aab77 100644 --- a/src/OSharp.CodeGenerator/Views/MainMenuViewModel.cs +++ b/src/OSharp.CodeGenerator/Views/MainMenuViewModel.cs @@ -8,10 +8,13 @@ // ----------------------------------------------------------------------- using System; +using System.Diagnostics; using System.Windows; +using OSharp.CodeGenerator.Views.Helps; using OSharp.CodeGenerator.Views.Projects; using OSharp.Wpf.Stylet; +using OSharp.Wpf.Utilities; using Stylet; @@ -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 64b5d8d..c516131 100644 --- a/src/OSharp.CodeGenerator/Views/MainView.xaml +++ b/src/OSharp.CodeGenerator/Views/MainView.xaml @@ -10,6 +10,7 @@ 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: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 +44,7 @@ + diff --git a/src/OSharp.CodeGenerator/Views/MainViewModel.cs b/src/OSharp.CodeGenerator/Views/MainViewModel.cs index de5c918..fa118f7 100644 --- a/src/OSharp.CodeGenerator/Views/MainViewModel.cs +++ b/src/OSharp.CodeGenerator/Views/MainViewModel.cs @@ -13,6 +13,7 @@ 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; @@ -51,6 +52,8 @@ namespace OSharp.CodeGenerator.Views public PropertyListViewModel PropertyList { 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() -- Gitee From 77d785e9f27330326ef05adb262f0e43a6e393a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E6=98=8E=E9=94=8B?= Date: Mon, 12 Apr 2021 19:05:21 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataService.CodeProjectTemplate.cs | 111 ++++++++++++++++++ .../Services/DataService.cs | 3 + .../Dtos/CodeProjectTemplateInputDto.cs | 36 ++++++ .../Services/IDataContract.cs | 30 +++++ .../Data/AutoMapperConfiguration.cs | 2 + .../Views/MainMenuViewModel.cs | 5 +- src/OSharp.CodeGenerator/Views/MainView.xaml | 2 + .../Views/MainViewModel.cs | 3 + .../Views/Modules/ModuleListViewModel.cs | 1 - .../Views/Modules/ModuleViewModel.cs | 7 +- .../Views/Projects/ProjectListViewModel.cs | 9 +- .../Views/Templates/TemplateListView.xaml | 96 +++++++++++++++ .../Views/Templates/TemplateListView.xaml.cs | 28 +++++ .../Views/Templates/TemplateListViewModel.cs | 110 +++++++++++++++++ .../Views/Templates/TemplateViewModel.cs | 104 ++++++++++++++++ 15 files changed, 537 insertions(+), 10 deletions(-) create mode 100644 src/OSharp.CodeGeneration/Services/DataService.CodeProjectTemplate.cs create mode 100644 src/OSharp.CodeGeneration/Services/Dtos/CodeProjectTemplateInputDto.cs create mode 100644 src/OSharp.CodeGenerator/Views/Templates/TemplateListView.xaml create mode 100644 src/OSharp.CodeGenerator/Views/Templates/TemplateListView.xaml.cs create mode 100644 src/OSharp.CodeGenerator/Views/Templates/TemplateListViewModel.cs create mode 100644 src/OSharp.CodeGenerator/Views/Templates/TemplateViewModel.cs diff --git a/src/OSharp.CodeGeneration/Services/DataService.CodeProjectTemplate.cs b/src/OSharp.CodeGeneration/Services/DataService.CodeProjectTemplate.cs new file mode 100644 index 0000000..f084f20 --- /dev/null +++ b/src/OSharp.CodeGeneration/Services/DataService.CodeProjectTemplate.cs @@ -0,0 +1,111 @@ +// ----------------------------------------------------------------------- +// +// 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) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/OSharp.CodeGeneration/Services/DataService.cs b/src/OSharp.CodeGeneration/Services/DataService.cs index 43edae1..d3f384a 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 0000000..01162d3 --- /dev/null +++ b/src/OSharp.CodeGeneration/Services/Dtos/CodeProjectTemplateInputDto.cs @@ -0,0 +1,36 @@ +// ----------------------------------------------------------------------- +// +// Copyright (c) 2014-2021 OSharp. All rights reserved. +// +// http://www.osharp.org +// 郭明锋 +// 2021-04-12 16:08 +// ----------------------------------------------------------------------- + +using System; + +using OSharp.Entity; + + +namespace OSharp.CodeGeneration.Services.Dtos +{ + 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/IDataContract.cs b/src/OSharp.CodeGeneration/Services/IDataContract.cs index 225cfbb..c975459 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/Data/AutoMapperConfiguration.cs b/src/OSharp.CodeGenerator/Data/AutoMapperConfiguration.cs index 5fc8887..93be623 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/Views/MainMenuViewModel.cs b/src/OSharp.CodeGenerator/Views/MainMenuViewModel.cs index 12aab77..ebc4c2d 100644 --- a/src/OSharp.CodeGenerator/Views/MainMenuViewModel.cs +++ b/src/OSharp.CodeGenerator/Views/MainMenuViewModel.cs @@ -13,6 +13,7 @@ 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; @@ -86,7 +87,9 @@ namespace OSharp.CodeGenerator.Views public void GlobalTemplate() { - + TemplateListViewModel templateList = IoC.Get(); + templateList.IsShow = true; + templateList.Init(); } #endregion diff --git a/src/OSharp.CodeGenerator/Views/MainView.xaml b/src/OSharp.CodeGenerator/Views/MainView.xaml index c516131..4bd043a 100644 --- a/src/OSharp.CodeGenerator/Views/MainView.xaml +++ b/src/OSharp.CodeGenerator/Views/MainView.xaml @@ -10,6 +10,7 @@ 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" @@ -44,6 +45,7 @@ + diff --git a/src/OSharp.CodeGenerator/Views/MainViewModel.cs b/src/OSharp.CodeGenerator/Views/MainViewModel.cs index fa118f7..4ff18eb 100644 --- a/src/OSharp.CodeGenerator/Views/MainViewModel.cs +++ b/src/OSharp.CodeGenerator/Views/MainViewModel.cs @@ -17,6 +17,7 @@ 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; @@ -52,6 +53,8 @@ namespace OSharp.CodeGenerator.Views public PropertyListViewModel PropertyList { get; set; } = IoC.Get(); + public TemplateListViewModel TemplateList { get; set; } = IoC.Get(); + public AboutViewModel About { get; set; } = IoC.Get(); public async Task Notify(string message, NotificationType type = NotificationType.Information, string title = "消息提示") diff --git a/src/OSharp.CodeGenerator/Views/Modules/ModuleListViewModel.cs b/src/OSharp.CodeGenerator/Views/Modules/ModuleListViewModel.cs index b074b7a..5d73008 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 ffa92e8..fb15dde 100644 --- a/src/OSharp.CodeGenerator/Views/Modules/ModuleViewModel.cs +++ b/src/OSharp.CodeGenerator/Views/Modules/ModuleViewModel.cs @@ -37,7 +37,8 @@ namespace OSharp.CodeGenerator.Views.Modules /// /// 初始化一个类型的新实例 /// - public ModuleViewModel(IModelValidator validator, IServiceProvider provider) : base(validator) + public ModuleViewModel(IModelValidator validator, IServiceProvider provider) + : base(validator) { _provider = provider; Validate(); @@ -72,14 +73,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 e56c1b1..dc45896 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/Templates/TemplateListView.xaml b/src/OSharp.CodeGenerator/Views/Templates/TemplateListView.xaml new file mode 100644 index 0000000..77ccdbd --- /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 0000000..026a2b3 --- /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 0000000..89f93be --- /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 0000000..cb66203 --- /dev/null +++ b/src/OSharp.CodeGenerator/Views/Templates/TemplateViewModel.cs @@ -0,0 +1,104 @@ +// ----------------------------------------------------------------------- +// +// 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() + { + + } + } +} -- Gitee From 972e3c0b845e76e23460556d0829847a311535ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E6=98=8E=E9=94=8B?= Date: Mon, 12 Apr 2021 19:44:55 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/Dtos/CodeTemplateInputDto.cs | 3 +++ .../Views/Templates/TemplateListView.xaml | 6 +++--- .../Views/Templates/TemplateViewModel.cs | 4 +++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/OSharp.CodeGeneration/Services/Dtos/CodeTemplateInputDto.cs b/src/OSharp.CodeGeneration/Services/Dtos/CodeTemplateInputDto.cs index 1ab9972..15803d9 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.CodeGenerator/Views/Templates/TemplateListView.xaml b/src/OSharp.CodeGenerator/Views/Templates/TemplateListView.xaml index 77ccdbd..05a8599 100644 --- a/src/OSharp.CodeGenerator/Views/Templates/TemplateListView.xaml +++ b/src/OSharp.CodeGenerator/Views/Templates/TemplateListView.xaml @@ -42,7 +42,7 @@ - + @@ -52,7 +52,7 @@ - + @@ -64,7 +64,7 @@ - + diff --git a/src/OSharp.CodeGenerator/Views/Templates/TemplateViewModel.cs b/src/OSharp.CodeGenerator/Views/Templates/TemplateViewModel.cs index cb66203..09d82e3 100644 --- a/src/OSharp.CodeGenerator/Views/Templates/TemplateViewModel.cs +++ b/src/OSharp.CodeGenerator/Views/Templates/TemplateViewModel.cs @@ -98,7 +98,9 @@ namespace OSharp.CodeGenerator.Views.Templates { public TemplateViewModelValidator() { - + RuleFor(m => m.Name).NotEmpty().WithMessage("模块名称不能为空"); + RuleFor(m => m.TemplateFile).NotEmpty().WithMessage("源代码文件不能为空"); + RuleFor(m => m.OutputFileFormat).NotEmpty().WithMessage("输出文件格式不能为空"); } } } -- Gitee From 928b8e7765ca3e9b33beab9f8e4896f82c87d438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E6=98=8E=E9=94=8B?= Date: Tue, 13 Apr 2021 00:42:41 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE-?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/DataService.CodeProject.cs | 5 + .../DataService.CodeProjectTemplate.cs | 5 +- .../Dtos/CodeProjectTemplateInputDto.cs | 3 + .../CodeProjectTemplateConfiguration.cs | 7 +- .../20210412164047_OnDelete1.Designer.cs | 566 ++++++++++++++++++ .../Migrations/20210412164047_OnDelete1.cs | 37 ++ .../DefaultDbContextModelSnapshot.cs | 2 +- .../Views/MainMenuViewModel.cs | 17 +- src/OSharp.CodeGenerator/Views/MainView.xaml | 1 + .../Views/MainViewModel.cs | 2 + .../Views/Modules/ModuleViewModel.cs | 5 +- .../Projects/ProjectTemplateListView.xaml | 74 +++ .../Projects/ProjectTemplateListView.xaml.cs | 28 + .../Projects/ProjectTemplateListViewModel.cs | 151 +++++ .../Projects/ProjectTemplateViewModel.cs | 87 +++ .../Views/Projects/ProjectViewModel.cs | 3 + .../Views/Templates/TemplateListView.xaml | 8 +- 17 files changed, 979 insertions(+), 22 deletions(-) create mode 100644 src/OSharp.CodeGenerator/Migrations/20210412164047_OnDelete1.Designer.cs create mode 100644 src/OSharp.CodeGenerator/Migrations/20210412164047_OnDelete1.cs create mode 100644 src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateListView.xaml create mode 100644 src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateListView.xaml.cs create mode 100644 src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateListViewModel.cs create mode 100644 src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateViewModel.cs diff --git a/src/OSharp.CodeGeneration/Services/DataService.CodeProject.cs b/src/OSharp.CodeGeneration/Services/DataService.CodeProject.cs index ec9d00c..f48942b 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 index f084f20..7a2c028 100644 --- a/src/OSharp.CodeGeneration/Services/DataService.CodeProjectTemplate.cs +++ b/src/OSharp.CodeGeneration/Services/DataService.CodeProjectTemplate.cs @@ -105,7 +105,10 @@ namespace OSharp.CodeGeneration.Services /// 业务操作结果 public async Task DeleteCodeProjectTemplates(params Guid[] ids) { - throw new NotImplementedException(); + UnitOfWork.EnableTransaction(); + OperationResult result = await ProjectTemplateRepository.DeleteAsync(ids); + await UnitOfWork.CommitAsync(); + return result; } } } diff --git a/src/OSharp.CodeGeneration/Services/Dtos/CodeProjectTemplateInputDto.cs b/src/OSharp.CodeGeneration/Services/Dtos/CodeProjectTemplateInputDto.cs index 01162d3..af1a084 100644 --- a/src/OSharp.CodeGeneration/Services/Dtos/CodeProjectTemplateInputDto.cs +++ b/src/OSharp.CodeGeneration/Services/Dtos/CodeProjectTemplateInputDto.cs @@ -9,11 +9,14 @@ 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 { /// 获取或设置 主键,唯一标识 diff --git a/src/OSharp.CodeGeneration/Services/Entities/CodeProjectTemplateConfiguration.cs b/src/OSharp.CodeGeneration/Services/Entities/CodeProjectTemplateConfiguration.cs index 803bf05..7ca0508 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.CodeGenerator/Migrations/20210412164047_OnDelete1.Designer.cs b/src/OSharp.CodeGenerator/Migrations/20210412164047_OnDelete1.Designer.cs new file mode 100644 index 0000000..8fcb082 --- /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 0000000..a9a3e9d --- /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 41a0393..b1bb785 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/Views/MainMenuViewModel.cs b/src/OSharp.CodeGenerator/Views/MainMenuViewModel.cs index ebc4c2d..1bd33dc 100644 --- a/src/OSharp.CodeGenerator/Views/MainMenuViewModel.cs +++ b/src/OSharp.CodeGenerator/Views/MainMenuViewModel.cs @@ -70,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 @@ -87,9 +84,9 @@ namespace OSharp.CodeGenerator.Views public void GlobalTemplate() { - TemplateListViewModel templateList = IoC.Get(); - templateList.IsShow = true; - templateList.Init(); + TemplateListViewModel model = IoC.Get(); + model.IsShow = true; + model.Init(); } #endregion diff --git a/src/OSharp.CodeGenerator/Views/MainView.xaml b/src/OSharp.CodeGenerator/Views/MainView.xaml index 4bd043a..57f6a42 100644 --- a/src/OSharp.CodeGenerator/Views/MainView.xaml +++ b/src/OSharp.CodeGenerator/Views/MainView.xaml @@ -45,6 +45,7 @@ + diff --git a/src/OSharp.CodeGenerator/Views/MainViewModel.cs b/src/OSharp.CodeGenerator/Views/MainViewModel.cs index 4ff18eb..2e96e63 100644 --- a/src/OSharp.CodeGenerator/Views/MainViewModel.cs +++ b/src/OSharp.CodeGenerator/Views/MainViewModel.cs @@ -55,6 +55,8 @@ namespace OSharp.CodeGenerator.Views 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 = "消息提示") diff --git a/src/OSharp.CodeGenerator/Views/Modules/ModuleViewModel.cs b/src/OSharp.CodeGenerator/Views/Modules/ModuleViewModel.cs index fb15dde..def3027 100644 --- a/src/OSharp.CodeGenerator/Views/Modules/ModuleViewModel.cs +++ b/src/OSharp.CodeGenerator/Views/Modules/ModuleViewModel.cs @@ -33,10 +33,7 @@ namespace OSharp.CodeGenerator.Views.Modules public class ModuleViewModel : Screen { private readonly IServiceProvider _provider; - - /// - /// 初始化一个类型的新实例 - /// + public ModuleViewModel(IModelValidator validator, IServiceProvider provider) : base(validator) { diff --git a/src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateListView.xaml b/src/OSharp.CodeGenerator/Views/Projects/ProjectTemplateListView.xaml new file mode 100644 index 0000000..3d193eb --- /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 0000000..d12aef1 --- /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 0000000..85795cb --- /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 0000000..c5bbc81 --- /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 f48a350..608dac0 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 index 05a8599..05f502f 100644 --- a/src/OSharp.CodeGenerator/Views/Templates/TemplateListView.xaml +++ b/src/OSharp.CodeGenerator/Views/Templates/TemplateListView.xaml @@ -17,21 +17,21 @@ - 模板列表 + 全局模板列表 - - -