using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.IO; using System.Linq; using System.Reflection; using System.Text; using WalkingTec.Mvvm.Core; using WalkingTec.Mvvm.Core.Extensions; namespace WalkingTec.Mvvm.Mvc { public enum ApiAuthMode { [Display(Name = "Both Jwt and Cookie")] Both, [Display(Name = "Jwt")] Jwt, [Display(Name = "Cookie")] Cookie } [ReInit(ReInitModes.ALWAYS)] public class CodeGenVM : BaseVM { public CodeGenListVM FieldList { get; set; } public List FieldInfos { get; set; } public string PreviewFile { get; set; } public UIEnum UI { get; set; } [Display(Name = "Codegen.GenApi")] public bool IsApi { get; set; } [Display(Name = "Codegen.AuthMode")] public ApiAuthMode AuthMode { get; set; } public string ModelName { get { return SelectedModel?.Split(',').FirstOrDefault()?.Split('.').LastOrDefault() ?? ""; } } [Display(Name = "Codegen.ModelNS")] [ValidateNever()] public string ModelNS => SelectedModel?.Split(',').FirstOrDefault()?.Split('.').SkipLast(1).ToSepratedString(seperator: "."); [Display(Name = "Codegen.ModuleName")] [Required(ErrorMessage = "Validate.{0}required")] public string ModuleName { get; set; } [RegularExpression("^[A-Za-z_]+", ErrorMessage = "Codegen.EnglishOnly")] public string Area { get; set; } [ValidateNever()] [BindNever()] public List AllModels { get; set; } [Required(ErrorMessage = "Validate.{0}required")] [Display(Name = "_Admin.SelectedModel")] public string SelectedModel { get; set; } [ValidateNever()] public string EntryDir { get; set; } public string _mainDir; [ValidateNever()] public string MainDir { get { if (_mainDir == null) { int? index = EntryDir?.IndexOf($"{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}Debug{Path.DirectorySeparatorChar}"); if (index == null || index < 0) { index = EntryDir?.IndexOf($"{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}Release{Path.DirectorySeparatorChar}") ?? 0; } _mainDir = EntryDir?.Substring(0, index.Value); } return _mainDir; } set { _mainDir = value; } } public string _vmdir; [ValidateNever()] public string VmDir { get { if (_vmdir == null) { var up = Directory.GetParent(MainDir); var vmdir = up.GetDirectories().Where(x => x.Name.ToLower().EndsWith(".viewmodel")).FirstOrDefault(); if (vmdir == null) { if (string.IsNullOrEmpty(Area)) { vmdir = Directory.CreateDirectory(MainDir + $"{Path.DirectorySeparatorChar}ViewModels{Path.DirectorySeparatorChar}{ModelName}VMs"); } else { vmdir = Directory.CreateDirectory(MainDir + $"{Path.DirectorySeparatorChar}Areas{Path.DirectorySeparatorChar}{Area}{Path.DirectorySeparatorChar}ViewModels{Path.DirectorySeparatorChar}{ModelName}VMs"); } } else { if (string.IsNullOrEmpty(Area)) { vmdir = Directory.CreateDirectory(vmdir.FullName + $"{Path.DirectorySeparatorChar}{ModelName}VMs"); } else { vmdir = Directory.CreateDirectory(vmdir.FullName + $"{Path.DirectorySeparatorChar}{Area}{Path.DirectorySeparatorChar}{ModelName}VMs"); } } _vmdir = vmdir.FullName; } return _vmdir; } } public string _sharedir; [ValidateNever()] public string ShareDir { get { if (_sharedir == null) { var up = Directory.GetParent(MainDir); var sharedir = up.GetDirectories().Where(x => x.Name.ToLower().EndsWith(".shared")).FirstOrDefault(); if (string.IsNullOrEmpty(Area)) { sharedir = Directory.CreateDirectory(sharedir.FullName + $"{Path.DirectorySeparatorChar}Pages{Path.DirectorySeparatorChar}{ModelName}"); } else { sharedir = Directory.CreateDirectory(sharedir.FullName + $"{Path.DirectorySeparatorChar}Pages{Path.DirectorySeparatorChar}{Area}{Path.DirectorySeparatorChar}{ModelName}"); } _sharedir = sharedir.FullName; } return _sharedir; } } public string _testdir; [ValidateNever()] public string TestDir { get { if (_testdir == null) { var up = Directory.GetParent(MainDir); var testdir = up.GetDirectories().Where(x => x.Name.ToLower().EndsWith(".test")).FirstOrDefault(); _testdir = testdir?.FullName; } return _testdir; } } public string _controllerdir; [ValidateNever()] public string ControllerDir { get { if (_controllerdir == null) { if (string.IsNullOrEmpty(Area)) { _controllerdir = Directory.CreateDirectory(MainDir + $"{Path.DirectorySeparatorChar}Controllers").FullName; } else { _controllerdir = Directory.CreateDirectory(MainDir + $"{Path.DirectorySeparatorChar}Areas{Path.DirectorySeparatorChar}{Area}{Path.DirectorySeparatorChar}Controllers").FullName; } } return _controllerdir; } } public string _viewdir; [ValidateNever()] public string ViewDir { get { if (_viewdir == null) { if (string.IsNullOrEmpty(Area)) { _viewdir = Directory.CreateDirectory(MainDir + $"{Path.DirectorySeparatorChar}Views{Path.DirectorySeparatorChar}{ModelName}").FullName; } else { _viewdir = Directory.CreateDirectory(MainDir + $"{Path.DirectorySeparatorChar}Areas{Path.DirectorySeparatorChar}{Area}{Path.DirectorySeparatorChar}Views{Path.DirectorySeparatorChar}{ModelName}").FullName; } } return _viewdir; } } private string _mainNs; public string MainNS { get { int index = MainDir.LastIndexOf(Path.DirectorySeparatorChar); if (index > 0) { _mainNs = MainDir[(index + 1)..]; } else { _mainNs = MainDir; } return _mainNs; } set { _mainNs = value; } } private string _controllerNs; [Display(Name = "Codegen.ControllerNs")] [ValidateNever()] public string ControllerNs { get { if (_controllerNs == null) { _controllerNs = MainNS + ".Controllers"; } return _controllerNs; } set { _controllerNs = value; } } private string _testNs; [Display(Name = "Codegen.TestNs")] [ValidateNever()] public string TestNs { get { if (_testNs == null) { _testNs = MainNS + ".Test"; } return _testNs; } set { _testNs = value; } } private string _dataNs; [Display(Name = "Codegen.DataNs")] [ValidateNever()] public string DataNs { get { if (_dataNs == null) { var up = Directory.GetParent(MainDir); var vmdir = up.GetDirectories().Where(x => x.Name.ToLower().EndsWith(".dataaccess")).FirstOrDefault(); if (vmdir == null) { _dataNs = MainNS; } else { _dataNs = MainNS + ".DataAccess"; ; } } return _dataNs; } set { _dataNs = value; } } private string _vmNs; [Display(Name = "Codegen.VMNs")] [ValidateNever()] public string VMNs { get { if (_vmNs == null) { var up = Directory.GetParent(MainDir); var vmdir = up.GetDirectories().Where(x => x.Name.ToLower().EndsWith(".viewmodel")).FirstOrDefault(); if (vmdir == null) { if (string.IsNullOrEmpty(Area)) { _vmNs = MainNS + $".ViewModels.{ModelName}VMs"; } else { _vmNs = MainNS + $".{Area}.ViewModels.{ModelName}VMs"; } } else { int index = vmdir.FullName.LastIndexOf(Path.DirectorySeparatorChar); if (index > 0) { _vmNs = vmdir.FullName[(index + 1)..]; } else { _vmNs = vmdir.FullName; } if (string.IsNullOrEmpty(Area)) { _vmNs += $".{ModelName}VMs"; } else { _vmNs += $".{Area}.{ModelName}VMs"; } } } return _vmNs; } set { _vmNs = value; } } protected override void InitVM() { if (string.IsNullOrEmpty(SelectedModel) == false) { foreach (var item in ConfigInfo.Connections) { var dc = item.CreateDC(); Type t = typeof(DbSet<>).MakeGenericType(Type.GetType(SelectedModel)); var exist = dc.GetType().GetSingleProperty(x => x.PropertyType == t); if (exist != null) { this.DC = dc; } } } FieldList = new CodeGenListVM(); FieldList.CopyContext(this); } public void DoGen() { File.WriteAllText($"{ControllerDir}{Path.DirectorySeparatorChar}{ModelName}{(IsApi == true ? "Api" : "")}Controller.cs", GenerateController(), Encoding.UTF8); File.WriteAllText($"{VmDir}{Path.DirectorySeparatorChar}{ModelName}{(IsApi == true ? "Api" : "")}VM.cs", GenerateVM("CrudVM"), Encoding.UTF8); File.WriteAllText($"{VmDir}{Path.DirectorySeparatorChar}{ModelName}{(IsApi == true ? "Api" : "")}ListVM.cs", GenerateVM("ListVM"), Encoding.UTF8); File.WriteAllText($"{VmDir}{Path.DirectorySeparatorChar}{ModelName}{(IsApi == true ? "Api" : "")}BatchVM.cs", GenerateVM("BatchVM"), Encoding.UTF8); File.WriteAllText($"{VmDir}{Path.DirectorySeparatorChar}{ModelName}{(IsApi == true ? "Api" : "")}ImportVM.cs", GenerateVM("ImportVM"), Encoding.UTF8); File.WriteAllText($"{VmDir}{Path.DirectorySeparatorChar}{ModelName}{(IsApi == true ? "Api" : "")}Searcher.cs", GenerateVM("Searcher"), Encoding.UTF8); if (IsApi == false) { if (UI == UIEnum.LayUI) { File.WriteAllText($"{ViewDir}{Path.DirectorySeparatorChar}Index.cshtml", GenerateView("ListView"), Encoding.UTF8); File.WriteAllText($"{ViewDir}{Path.DirectorySeparatorChar}Create.cshtml", GenerateView("CreateView"), Encoding.UTF8); File.WriteAllText($"{ViewDir}{Path.DirectorySeparatorChar}Edit.cshtml", GenerateView("EditView"), Encoding.UTF8); File.WriteAllText($"{ViewDir}{Path.DirectorySeparatorChar}Delete.cshtml", GenerateView("DeleteView"), Encoding.UTF8); File.WriteAllText($"{ViewDir}{Path.DirectorySeparatorChar}Details.cshtml", GenerateView("DetailsView"), Encoding.UTF8); File.WriteAllText($"{ViewDir}{Path.DirectorySeparatorChar}Import.cshtml", GenerateView("ImportView"), Encoding.UTF8); File.WriteAllText($"{ViewDir}{Path.DirectorySeparatorChar}BatchEdit.cshtml", GenerateView("BatchEditView"), Encoding.UTF8); File.WriteAllText($"{ViewDir}{Path.DirectorySeparatorChar}BatchDelete.cshtml", GenerateView("BatchDeleteView"), Encoding.UTF8); } if (UI == UIEnum.React || UI == UIEnum.VUE) { if (Directory.Exists($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}") == false) { Directory.CreateDirectory($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}"); } if (Directory.Exists($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}views") == false) { Directory.CreateDirectory($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}views"); } if (Directory.Exists($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}store") == false) { Directory.CreateDirectory($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}store"); } if (UI == UIEnum.React) { File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}views{Path.DirectorySeparatorChar}action.tsx", GenerateReactView("action"), Encoding.UTF8); File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}views{Path.DirectorySeparatorChar}forms.tsx", GenerateReactView("forms"), Encoding.UTF8); File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}views{Path.DirectorySeparatorChar}models.tsx", GenerateReactView("models"), Encoding.UTF8); File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}views{Path.DirectorySeparatorChar}other.tsx", GenerateReactView("other"), Encoding.UTF8); File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}views{Path.DirectorySeparatorChar}search.tsx", GenerateReactView("search"), Encoding.UTF8); File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}views{Path.DirectorySeparatorChar}table.tsx", GenerateReactView("table"), Encoding.UTF8); File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}store{Path.DirectorySeparatorChar}index.ts", GetResource("index.txt", "Spa.React.store").Replace("$modelname$", ModelName.ToLower()), Encoding.UTF8); File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}index.tsx", GetResource("index.txt", "Spa.React").Replace("$modelname$", ModelName.ToLower()), Encoding.UTF8); File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}style.less", GetResource("style.txt", "Spa.React").Replace("$modelname$", ModelName.ToLower()), Encoding.UTF8); } if (UI == UIEnum.VUE) { List apipneeded = new List(); File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}index.vue", GenerateVUEView("index", apipneeded), Encoding.UTF8); File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}config.ts", GenerateVUEView("config", apipneeded), Encoding.UTF8); File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}views{Path.DirectorySeparatorChar}dialog-form.vue", GenerateVUEView("views.dialog-form", apipneeded), Encoding.UTF8); File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}store{Path.DirectorySeparatorChar}index.ts", GetResource("index.txt", "Spa.Vue.store").Replace("$modelname$", ModelName.ToLower()), Encoding.UTF8); File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}{ModelName.ToLower()}{Path.DirectorySeparatorChar}store{Path.DirectorySeparatorChar}api.ts", GenerateVUEView("store.api", apipneeded), Encoding.UTF8); } var index = File.ReadAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}index.ts"); if (index.Contains($"path: '/{ModelName.ToLower()}'") == false) { if (UI == UIEnum.React) { index = index.Replace("/**WTM**/", $@" , {ModelName.ToLower()}: {{ name: '{ModuleName.ToLower()}', path: '/{ModelName.ToLower()}', controller: '{ControllerNs},{ModelName}', component: React.lazy(() => import('./{ModelName.ToLower()}')) }} /**WTM**/ "); } if (UI == UIEnum.VUE) { index = index.Replace("/**WTM**/", $@" , {ModelName.ToLower()}: {{ name: '{ModuleName.ToLower()}', path: '/{ModelName.ToLower()}', controller: '{ControllerNs},{ModelName}' }} /**WTM**/ "); } File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}pages{Path.DirectorySeparatorChar}index.ts", index, Encoding.UTF8); } string menu = ""; if (UI == UIEnum.React) { menu = File.ReadAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}public{Path.DirectorySeparatorChar}subMenu.json"); if (menu.Contains($@"""Url"": ""/{ModelName.ToLower()}""") == false) { var i = menu.LastIndexOf("}"); menu = menu.Insert(i + 1, $@" ,{{ ""Id"": ""{Guid.NewGuid()}"", ""ParentId"": null, ""Text"": ""{ModuleName.ToLower()}"", ""Url"": ""/{ModelName.ToLower()}"" }} "); File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}public{Path.DirectorySeparatorChar}subMenu.json", menu, Encoding.UTF8); } } if (UI == UIEnum.VUE) { menu = File.ReadAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}subMenu.json"); if (menu.Contains($@"""Url"": ""/{ModelName.ToLower()}""") == false) { var i = menu.LastIndexOf("}"); menu = menu.Insert(i + 1, $@" ,{{ ""Id"": ""{Guid.NewGuid()}"", ""ParentId"": null, ""Text"": ""{ModuleName.ToLower()}"", ""Url"": ""/{ModelName.ToLower()}"" }} "); File.WriteAllText($"{MainDir}{Path.DirectorySeparatorChar}ClientApp{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}subMenu.json", menu, Encoding.UTF8); } } } if(UI == UIEnum.Blazor) { File.WriteAllText($"{ShareDir}{Path.DirectorySeparatorChar}Index.razor", GenerateBlazorView("Index"), Encoding.UTF8); File.WriteAllText($"{ShareDir}{Path.DirectorySeparatorChar}Create.razor", GenerateBlazorView("Create"), Encoding.UTF8); File.WriteAllText($"{ShareDir}{Path.DirectorySeparatorChar}Edit.razor", GenerateBlazorView("Edit"), Encoding.UTF8); File.WriteAllText($"{ShareDir}{Path.DirectorySeparatorChar}Details.razor", GenerateBlazorView("Details"), Encoding.UTF8); File.WriteAllText($"{ShareDir}{Path.DirectorySeparatorChar}Import.razor", GenerateBlazorView("Import"), Encoding.UTF8); } } var test = GenerateTest(); if (test != "") { if (UI == UIEnum.LayUI && IsApi == false) { File.WriteAllText($"{TestDir}{Path.DirectorySeparatorChar}{ModelName}ControllerTest.cs", test, Encoding.UTF8); } else { File.WriteAllText($"{TestDir}{Path.DirectorySeparatorChar}{ModelName}ApiTest.cs", test, Encoding.UTF8); } } } public string GenerateController() { string dir = ""; string jwt = ""; if (UI == UIEnum.LayUI && IsApi == false) { dir = "Mvc"; } else { dir = "Spa"; if(UI == UIEnum.Blazor) { dir = "Spa.Blazor"; } switch (AuthMode) { case ApiAuthMode.Both: jwt = "[AuthorizeJwtWithCookie]"; break; case ApiAuthMode.Jwt: jwt = "[AuthorizeJwt]"; break; case ApiAuthMode.Cookie: jwt = "[AuthorizeCookie]"; break; default: break; } } var rv = GetResource("Controller.txt", dir).Replace("$jwt$", jwt).Replace("$vmnamespace$", VMNs).Replace("$namespace$", ControllerNs).Replace("$des$", ModuleName).Replace("$modelname$", ModelName).Replace("$modelnamespace$", ModelNS).Replace("$controllername$", $"{ModelName}{(IsApi == true ? "Api" : "")}"); if (string.IsNullOrEmpty(Area)) { rv = rv.Replace("$area$", ""); } else { rv = rv.Replace("$area$", $"[Area(\"{Area}\")]"); } //生成api中获取下拉菜单数据的api //如果一个一对多关联其他类的字段是搜索条件或者表单字段,则生成对应的获取关联表数据的api if (UI != UIEnum.LayUI || IsApi == true) { StringBuilder other = new StringBuilder(); List pros = FieldInfos.Where(x => x.IsSearcherField == true || x.IsFormField == true).ToList(); List existSubPro = new List(); for (int i = 0; i < pros.Count; i++) { var item = pros[i]; if ((item.InfoType == FieldInfoType.One2Many || item.InfoType == FieldInfoType.Many2Many) && item.SubField != "`file") { var subtype = Type.GetType(item.RelatedField); var subpro = subtype.GetSingleProperty(item.SubField); var key = subtype.FullName + ":" + subpro.Name; existSubPro.Add(key); int count = existSubPro.Where(x => x == key).Count(); if (count == 1) { other.AppendLine($@" [HttpGet(""Get{subtype.Name}s"")] public ActionResult Get{subtype.Name}s() {{ return Ok(DC.Set<{subtype.Name}>().GetSelectListItems(Wtm, x => x.{item.SubField})); }}"); } } } rv = rv.Replace("$other$", other.ToString()); rv = GetRelatedNamespace(pros, rv); } return rv; } public string GenerateVM(string name) { var rv = GetResource($"{name}.txt").Replace("$modelnamespace$", ModelNS).Replace("$vmnamespace$", VMNs).Replace("$modelname$", ModelName).Replace("$area$", $"{Area ?? ""}").Replace("$classname$", $"{ModelName}{(IsApi == true ? "Api" : "")}"); if (name == "Searcher" || name == "BatchVM") { string prostring = ""; string initstr = ""; Type modelType = Type.GetType(SelectedModel); List pros = null; if (name == "Searcher") { pros = FieldInfos.Where(x => x.IsSearcherField == true).ToList(); } if (name == "BatchVM") { pros = FieldInfos.Where(x => x.IsBatchField == true).ToList(); } foreach (var pro in pros) { //对于一对一或者一对多的搜索和批量修改字段,需要在vm中生成对应的变量来获取关联表的数据 if (pro.InfoType != FieldInfoType.Normal) { var subtype = Type.GetType(pro.RelatedField); if (typeof(TopBasePoco).IsAssignableFrom(subtype) == false || subtype == typeof(FileAttachment)) { continue; } if (UI == UIEnum.LayUI && IsApi == false) { var fname = "All" + pro.FieldName + "s"; prostring += $@" public List {fname} {{ get; set; }}"; initstr += $@" {fname} = DC.Set<{subtype.Name}>().GetSelectListItems(Wtm, y => y.{pro.SubField});"; } } //生成普通字段定义 var proType = modelType.GetSingleProperty(pro.FieldName); var display = proType.GetCustomAttribute(); if (display != null) { prostring += $@" [Display(Name = ""{display.Name}"")]"; } string typename = proType.PropertyType.Name; string proname = pro.GetField(DC, modelType); switch (pro.InfoType) { case FieldInfoType.Normal: if (proType.PropertyType.IsNullable()) { typename = proType.PropertyType.GetGenericArguments()[0].Name + "?"; } else if (proType.PropertyType != typeof(string)) { typename = proType.PropertyType.Name + "?"; } break; case FieldInfoType.One2Many: typename = pro.GetFKType(DC, modelType); if (typename != "string") { typename += "?"; } break; case FieldInfoType.Many2Many: proname = $@"Selected{pro.FieldName}IDs"; typename = $"List<{pro.GetFKType(DC, modelType)}>"; break; default: break; } if ((typename == "DateTime" || typename == "DateTime?") && name == "Searcher") { typename = "DateRange"; } prostring += $@" public {typename} {proname} {{ get; set; }}"; } rv = rv.Replace("$pros$", prostring).Replace("$init$", initstr); rv = GetRelatedNamespace(pros, rv); } if (name == "ListVM") { string headerstring = ""; string selectstring = ""; string wherestring = ""; string subprostring = ""; string formatstring = ""; string actionstring = ""; if (UI == UIEnum.LayUI && IsApi == false) { actionstring = $@" protected override List InitGridAction() {{ return new List {{ this.MakeStandardAction(""{ModelName}"", GridActionStandardTypesEnum.Create, Localizer[""Sys.Create""],""{Area ?? ""}"", dialogWidth: 800), this.MakeStandardAction(""{ModelName}"", GridActionStandardTypesEnum.Edit, Localizer[""Sys.Edit""], ""{Area ?? ""}"", dialogWidth: 800), this.MakeStandardAction(""{ModelName}"", GridActionStandardTypesEnum.Delete, Localizer[""Sys.Delete""], ""{Area ?? ""}"", dialogWidth: 800), this.MakeStandardAction(""{ModelName}"", GridActionStandardTypesEnum.Details, Localizer[""Sys.Details""], ""{Area ?? ""}"", dialogWidth: 800), this.MakeStandardAction(""{ModelName}"", GridActionStandardTypesEnum.BatchEdit, Localizer[""Sys.BatchEdit""], ""{Area ?? ""}"", dialogWidth: 800), this.MakeStandardAction(""{ModelName}"", GridActionStandardTypesEnum.BatchDelete, Localizer[""Sys.BatchDelete""], ""{Area ?? ""}"", dialogWidth: 800), this.MakeStandardAction(""{ModelName}"", GridActionStandardTypesEnum.Import, Localizer[""Sys.Import""], ""{Area ?? ""}"", dialogWidth: 800), this.MakeStandardAction(""{ModelName}"", GridActionStandardTypesEnum.ExportExcel, Localizer[""Sys.Export""], ""{Area ?? ""}""), }}; }} "; } var pros = FieldInfos.Where(x => x.IsListField == true).ToList(); Type modelType = Type.GetType(SelectedModel); List existSubPro = new List(); foreach (var pro in pros) { if (pro.InfoType == FieldInfoType.Normal) { headerstring += $@" this.MakeGridHeader(x => x.{pro.FieldName}),"; if (pro.FieldName.ToLower() != "id") { selectstring += $@" {pro.FieldName} = x.{pro.FieldName},"; } } else { var subtype = Type.GetType(pro.RelatedField); if (subtype == typeof(FileAttachment)) { var filefk = DC.GetFKName2(modelType, pro.FieldName); headerstring += $@" this.MakeGridHeader(x => x.{filefk}).SetFormat({filefk}Format),"; selectstring += $@" {filefk} = x.{filefk},"; formatstring += GetResource("HeaderFormat.txt").Replace("$modelname$", ModelName).Replace("$field$", filefk).Replace("$classname$", $"{ModelName}{(IsApi == true ? "Api" : "")}"); } else { var subpro = subtype.GetSingleProperty(pro.SubField); existSubPro.Add(subpro); string prefix = ""; int count = existSubPro.Where(x => x.Name == subpro.Name).Count(); if (count > 1) { prefix = count + ""; } string subtypename = subpro.PropertyType.Name; if (subpro.PropertyType.IsNullable()) { subtypename = subpro.PropertyType.GetGenericArguments()[0].Name + "?"; } var subdisplay = subpro.GetCustomAttribute(); headerstring += $@" this.MakeGridHeader(x => x.{pro.SubField + "_view" + prefix}),"; if (pro.InfoType == FieldInfoType.One2Many) { selectstring += $@" {pro.SubField + "_view" + prefix} = x.{pro.FieldName}.{pro.SubField},"; } else { var middleType = modelType.GetSingleProperty(pro.FieldName).PropertyType.GenericTypeArguments[0]; var middlename = DC.GetPropertyNameByFk(middleType, pro.SubIdField); if(typeof(IPersistPoco).IsAssignableFrom(Type.GetType(pro.RelatedField))) { selectstring += $@" {pro.SubField + "_view" + prefix} = x.{pro.FieldName}.Where(y=>y.{middlename}.IsValid==true).Select(y=>y.{middlename}.{pro.SubField}).ToSepratedString(null,"",""), "; } else { selectstring += $@" {pro.SubField + "_view" + prefix} = x.{pro.FieldName}.Select(y=>y.{middlename}.{pro.SubField}).ToSepratedString(null,"",""), "; } } if (subdisplay?.Name != null) { subprostring += $@" [Display(Name = ""{subdisplay.Name}"")]"; } subprostring += $@" public {subtypename} {pro.SubField + "_view" + prefix} {{ get; set; }}"; } } } var wherepros = FieldInfos.Where(x => x.IsSearcherField == true).ToList(); foreach (var pro in wherepros) { if (pro.SubField == "`file") { continue; } var proType = modelType.GetSingleProperty(pro.FieldName)?.PropertyType; switch (pro.InfoType) { case FieldInfoType.Normal: if (proType == typeof(string)) { wherestring += $@" .CheckContain(Searcher.{pro.FieldName}, x=>x.{pro.FieldName})"; } else if (proType == typeof(DateTime) || proType == typeof(DateTime?)) { wherestring += $@" .CheckBetween(Searcher.{pro.FieldName}?.GetStartTime(), Searcher.{pro.FieldName}?.GetEndTime(), x => x.{pro.FieldName}, includeMax: false)"; } else { wherestring += $@" .CheckEqual(Searcher.{pro.FieldName}, x=>x.{pro.FieldName})"; } break; case FieldInfoType.One2Many: var fk = DC.GetFKName2(modelType, pro.FieldName); wherestring += $@" .CheckEqual(Searcher.{fk}, x=>x.{fk})"; break; case FieldInfoType.Many2Many: var subtype = Type.GetType(pro.RelatedField); var fk2 = DC.GetFKName(modelType, pro.FieldName); wherestring += $@" .CheckWhere(Searcher.Selected{pro.FieldName}IDs,x=>DC.Set<{proType.GetGenericArguments()[0].Name}>().Where(y=>Searcher.Selected{pro.FieldName}IDs.Contains(y.{pro.SubIdField})).Select(z=>z.{fk2}).Contains(x.ID))"; break; default: break; } } rv = rv.Replace("$headers$", headerstring).Replace("$where$", wherestring).Replace("$select$", selectstring).Replace("$subpros$", subprostring).Replace("$format$", formatstring).Replace("$actions$", actionstring); rv = GetRelatedNamespace(pros, rv); } if (name == "CrudVM") { string prostr = ""; string initstr = ""; string includestr = ""; string addstr = ""; string editstr = ""; var pros = FieldInfos.Where(x => x.IsFormField == true && string.IsNullOrEmpty(x.RelatedField) == false).ToList(); foreach (var pro in pros) { var subtype = Type.GetType(pro.RelatedField); if (typeof(TopBasePoco).IsAssignableFrom(subtype) == false || subtype == typeof(FileAttachment)) { continue; } var fname = "All" + pro.FieldName + "s"; if (UI == UIEnum.LayUI) { prostr += $@" public List {fname} {{ get; set; }}"; initstr += $@" {fname} = DC.Set<{subtype.Name}>().GetSelectListItems(Wtm, y => y.{pro.SubField});"; } includestr += $@" SetInclude(x => x.{pro.FieldName});"; if (pro.InfoType == FieldInfoType.Many2Many) { Type modelType = Type.GetType(SelectedModel); var protype = modelType.GetSingleProperty(pro.FieldName); prostr += $@" [Display(Name = ""{protype.GetPropertyDisplayName()}"")] public List Selected{pro.FieldName}IDs {{ get; set; }}"; initstr += $@" Selected{pro.FieldName}IDs = Entity.{pro.FieldName}?.Select(x => x.{pro.SubIdField}.ToString()).ToList();"; addstr += $@" Entity.{pro.FieldName} = new List<{protype.PropertyType.GetGenericArguments()[0].Name}>(); if (Selected{pro.FieldName}IDs != null) {{ foreach (var id in Selected{pro.FieldName}IDs) {{ {protype.PropertyType.GetGenericArguments()[0].Name} middle = new {protype.PropertyType.GetGenericArguments()[0].Name}(); middle.SetPropertyValue(""{pro.SubIdField}"", id); Entity.{pro.FieldName}.Add(middle); }} }} "; editstr += $@" Entity.{pro.FieldName} = new List<{protype.PropertyType.GetGenericArguments()[0].Name}>(); if(Selected{pro.FieldName}IDs != null ) {{ foreach (var item in Selected{pro.FieldName}IDs) {{ {protype.PropertyType.GetGenericArguments()[0].Name} middle = new {protype.PropertyType.GetGenericArguments()[0].Name}(); middle.SetPropertyValue(""{pro.SubIdField}"", item); Entity.{pro.FieldName}.Add(middle); }} }} "; } } if ((UI == UIEnum.LayUI && IsApi == false) || UI == UIEnum.Blazor) { rv = rv.Replace("$pros$", prostr).Replace("$init$", initstr).Replace("$include$", includestr).Replace("$add$", addstr).Replace("$edit$", editstr); } else { rv = rv.Replace("$pros$", "").Replace("$init$", "").Replace("$include$", includestr).Replace("$add$", "").Replace("$edit$", ""); } rv = GetRelatedNamespace(pros, rv); } if (name == "ImportVM") { string prostring = ""; string initstr = ""; Type modelType = Type.GetType(SelectedModel); List pros = FieldInfos.Where(x => x.IsImportField == true).ToList(); foreach (var pro in pros) { if (pro.InfoType == FieldInfoType.Many2Many) { continue; } if (string.IsNullOrEmpty(pro.RelatedField) == false) { var subtype = Type.GetType(pro.RelatedField); if (typeof(TopBasePoco).IsAssignableFrom(subtype) == false || subtype == typeof(FileAttachment)) { continue; } initstr += $@" {pro.FieldName + "_Excel"}.DataType = ColumnDataType.ComboBox; {pro.FieldName + "_Excel"}.ListItems = DC.Set<{subtype.Name}>().GetSelectListItems(Wtm, y => y.{pro.SubField});"; } var proType = modelType.GetSingleProperty(pro.FieldName); var display = proType.GetCustomAttribute(); var filefk = DC.GetFKName2(modelType, pro.FieldName); if (display != null) { prostring += $@" [Display(Name = ""{display.Name}"")]"; } if (string.IsNullOrEmpty(pro.RelatedField) == false) { prostring += $@" public ExcelPropety {pro.FieldName + "_Excel"} = ExcelPropety.CreateProperty<{ModelName}>(x => x.{filefk});"; } else { prostring += $@" public ExcelPropety {pro.FieldName + "_Excel"} = ExcelPropety.CreateProperty<{ModelName}>(x => x.{pro.FieldName});"; } } rv = rv.Replace("$pros$", prostring).Replace("$init$", initstr); rv = GetRelatedNamespace(pros, rv); } return rv; } public string GenerateView(string name) { var rv = GetResource($"{name}.txt", "Mvc").Replace("$vmnamespace$", VMNs).Replace("$modelname$", ModelName); if (name == "CreateView" || name == "EditView" || name == "DeleteView" || name == "DetailsView" || name == "BatchEditView") { StringBuilder fieldstr = new StringBuilder(); string pre = ""; List pros = null; if (name == "BatchEditView") { pros = FieldInfos.Where(x => x.IsBatchField == true).ToList(); pre = "LinkedVM"; } else { pros = FieldInfos.Where(x => x.IsFormField == true).ToList(); pre = "Entity"; } Type modelType = Type.GetType(SelectedModel); fieldstr.Append(Environment.NewLine); fieldstr.Append(@""); fieldstr.Append(Environment.NewLine); foreach (var item in pros) { if (name == "DeleteView" || name == "DetailsView") { if (string.IsNullOrEmpty(item.SubIdField) == true) { if (string.IsNullOrEmpty(item.RelatedField) == false && item.SubField != "`file") { fieldstr.Append($@""); } else { string idname = item.FieldName; if (string.IsNullOrEmpty(item.RelatedField) == false && item.SubField == "`file") { var filefk = DC.GetFKName2(modelType, item.FieldName); idname = filefk; } fieldstr.Append($@""); } } } else { if (string.IsNullOrEmpty(item.RelatedField) == false) { var filefk = DC.GetFKName2(modelType, item.FieldName); if (item.SubField == "`file") { if (name != "BatchEditView") { fieldstr.Append($@""); } } else { var fname = "All" + item.FieldName + "s"; if (name == "BatchEditView") { fname = "LinkedVM." + fname; } if (string.IsNullOrEmpty(item.SubIdField)) { fieldstr.Append($@""); } else { if (name == "BatchEditView") { fieldstr.Append($@""); } else { fieldstr.Append($@""); } } } } else { var proType = modelType.GetSingleProperty(item.FieldName)?.PropertyType; Type checktype = proType; if (proType.IsNullable()) { checktype = proType.GetGenericArguments()[0]; } if(checktype == typeof(bool) && proType.IsNullable() == false) { fieldstr.Append($@""); } else if (checktype == typeof(bool) || checktype.IsEnum()) { fieldstr.Append($@""); } else if (checktype.IsPrimitive || checktype == typeof(string) || checktype == typeof(decimal)) { fieldstr.Append($@""); } else if (checktype == typeof(DateTime)) { fieldstr.Append($@""); } } } fieldstr.Append(Environment.NewLine); } fieldstr.Append(""); rv = rv.Replace("$fields$", fieldstr.ToString()); } if (name == "ListView") { StringBuilder fieldstr = new StringBuilder(); var pros = FieldInfos.Where(x => x.IsSearcherField == true).ToList(); Type modelType = Type.GetType(SelectedModel); fieldstr.Append(Environment.NewLine); fieldstr.Append(@""); fieldstr.Append(Environment.NewLine); foreach (var item in pros) { if (string.IsNullOrEmpty(item.RelatedField) == false) { if (item.SubField == "`file") { continue; } var fname = "All" + item.FieldName + "s"; var fk = ""; if (string.IsNullOrEmpty(item.SubIdField)) { fk = DC.GetFKName2(modelType, item.FieldName); ; } else { fk = $@"Selected{item.FieldName}IDs"; } fieldstr.Append($@""); } else { var proType = modelType.GetSingleProperty(item.FieldName)?.PropertyType; Type checktype = proType; if (proType.IsNullable()) { checktype = proType.GetGenericArguments()[0]; } if ((checktype.IsPrimitive && checktype != typeof(bool)) || checktype == typeof(string) || checktype == typeof(decimal)) { fieldstr.Append($@""); } if (checktype == typeof(DateTime)) { fieldstr.Append($@""); } if (checktype.IsEnum() || checktype.IsBool()) { fieldstr.Append($@""); } } fieldstr.Append(Environment.NewLine); } fieldstr.Append($@""); string url = ""; if (string.IsNullOrEmpty(Area)) { url = $"/{ModelName}/Search"; } else { url = $"/{Area}/{ModelName}/Search"; } rv = rv.Replace("$fields$", fieldstr.ToString()).Replace("$searchurl$", url); } return rv; } public string GenerateTest() { var rv = ""; if (TestDir != null) { Type modelType = Type.GetType(SelectedModel); if (UI == UIEnum.LayUI && IsApi == false) { if (typeof(IBasePoco).IsAssignableFrom( modelType) || typeof(IPersistPoco).IsAssignableFrom(modelType)) { rv = GetResource($"ControllerTest.txt").Replace("$cns$", ControllerNs).Replace("$tns$", TestNs).Replace("$vns$", VMNs).Replace("$model$", ModelName).Replace("$mns$", ModelNS).Replace("$dns$", DataNs); } else { rv = GetResource($"ControllerTestTopPoco.txt").Replace("$cns$", ControllerNs).Replace("$tns$", TestNs).Replace("$vns$", VMNs).Replace("$model$", ModelName).Replace("$mns$", ModelNS).Replace("$dns$", DataNs); } } else { if (typeof(IBasePoco).IsAssignableFrom(modelType) || typeof(IPersistPoco).IsAssignableFrom(modelType)) { rv = GetResource($"ApiTest.txt").Replace("$cns$", ControllerNs).Replace("$tns$", TestNs).Replace("$vns$", VMNs).Replace("$model$", ModelName).Replace("$mns$", ModelNS).Replace("$dns$", DataNs).Replace("$classnamel$", $"{ModelName}{(IsApi == true ? "Api" : "")}"); } else { rv = GetResource($"ApiTestTopPoco.txt").Replace("$cns$", ControllerNs).Replace("$tns$", TestNs).Replace("$vns$", VMNs).Replace("$model$", ModelName).Replace("$mns$", ModelNS).Replace("$dns$", DataNs).Replace("$classnamel$", $"{ModelName}{(IsApi == true ? "Api" : "")}"); } } var modelprops = modelType.GetRandomValues(); var batchpros = FieldInfos.Where(x => x.IsBatchField == true).ToList(); string cpros = ""; string epros = ""; string pros = ""; string mpros = ""; string assert = ""; string eassert = ""; string fc = ""; string add = ""; string linkedpros = ""; string linkedfc = ""; string meassert = ""; List addexist = new List(); foreach (var pro in modelprops) { if (pro.Value == "$fk$") { var fktype = modelType.GetSingleProperty(pro.Key[0..^2])?.PropertyType; add += GenerateAddFKModel(pro.Key[0..^2], fktype, addexist); } } foreach (var pro in modelprops) { if (pro.Value == "$fk$") { var fktype = modelType.GetSingleProperty(pro.Key[0..^2])?.PropertyType; cpros += $@" v.{pro.Key} = Add{fktype.Name}();"; pros += $@" v.{pro.Key} = Add{fktype.Name}();"; mpros += $@" v1.{pro.Key} = Add{fktype.Name}();"; } else { cpros += $@" v.{pro.Key} = {pro.Value};"; pros += $@" v.{pro.Key} = {pro.Value};"; mpros += $@" v1.{pro.Key} = {pro.Value};"; assert += $@" Assert.AreEqual(data.{pro.Key}, {pro.Value});"; } fc += $@" vm.FC.Add(""Entity.{pro.Key}"", """");"; } var modelpros2 = modelType.GetRandomValues(); foreach (var pro in modelpros2) { //if (pro.Key.ToLower() == "id") //{ // continue; //} if (pro.Value == "$fk$") { mpros += $@" v2.{ pro.Key} = v1.{pro.Key}; "; } else { mpros += $@" v2.{pro.Key} = {pro.Value};"; if (pro.Key.ToLower() != "id") { epros += $@" v.{pro.Key} = {pro.Value};"; eassert += $@" Assert.AreEqual(data.{pro.Key}, {pro.Value});"; } } } var modelpros3 = modelType.GetRandomValues(); foreach (var pro in modelpros3) { if (batchpros.Any(x => x.FieldName == pro.Key) && pro.Key.ToLower() != "id") { linkedpros += $@" vm.LinkedVM.{pro.Key} = {pro.Value};"; linkedfc += $@" vm.FC.Add(""LinkedVM.{pro.Key}"", """");"; meassert += $@" Assert.AreEqual(data1.{pro.Key}, {pro.Value});"; meassert += $@" Assert.AreEqual(data2.{pro.Key}, {pro.Value});"; } } string del = $"Assert.AreEqual(data, null);"; string mdel = @"Assert.AreEqual(data1, null); Assert.AreEqual(data2, null);"; if (typeof(IPersistPoco).IsAssignableFrom( modelType)) { del = $"Assert.AreEqual(data.IsValid, false);"; mdel = @"Assert.AreEqual(data1.IsValid, false); Assert.AreEqual(data2.IsValid, false);"; } rv = rv.Replace("$cpros$", cpros).Replace("$epros$", epros).Replace("$pros$", pros).Replace("$mpros$", mpros) .Replace("$assert$", assert).Replace("$eassert$", eassert).Replace("$fc$", fc).Replace("$add$", add).Replace("$del$", del).Replace("$mdel$", mdel) .Replace("$linkedpros$", linkedpros).Replace("$linkedfc$", linkedfc).Replace("$meassert$", meassert); rv = GetRelatedNamespace(FieldInfos.Where(x=>string.IsNullOrEmpty( x.RelatedField) == false).ToList(), rv); } return rv; } private string GenerateAddFKModel(string keyname, Type t, List exist) { if(exist == null) { exist = new List(); } if(exist.Contains(t) == true) { return ""; } exist.Add(t); var modelprops = t.GetRandomValues(); var mname = t.Name?.Split(',').FirstOrDefault()?.Split('.').LastOrDefault() ?? ""; string cpros = ""; string rv = ""; foreach (var pro in modelprops) { if (pro.Value == "$fk$") { var fktype = t.GetSingleProperty(pro.Key[0..^2])?.PropertyType; if (fktype != t) { rv += GenerateAddFKModel(pro.Key[0..^2], fktype, exist); } } } foreach (var pro in modelprops) { if (pro.Value == "$fk$") { var fktype = t.GetSingleProperty(pro.Key[0..^2])?.PropertyType; if (fktype != t) { cpros += $@" v.{pro.Key} = Add{fktype.Name}();"; } } else { cpros += $@" v.{pro.Key} = {pro.Value};"; } } var idpro = t.GetSingleProperty("ID"); rv += $@" private {idpro.PropertyType.Name} Add{t.Name}() {{ {mname} v = new {mname}(); using (var context = new DataContext(_seed, DBTypeEnum.Memory)) {{ try{{ {cpros} context.Set<{mname}>().Add(v); context.SaveChanges(); }} catch{{}} }} return v.ID; }} "; return rv; } public string GenerateReactView(string name) { var rv = GetResource($"{name}.txt", "Spa.React.views") .Replace("$modelname$", ModelName.ToLower()); Type modelType = Type.GetType(SelectedModel); if (name == "table") { StringBuilder fieldstr = new StringBuilder(); var pros = FieldInfos.Where(x => x.IsListField == true).ToList(); fieldstr.Append(Environment.NewLine); List existSubPro = new List(); int rowheight = 30; for (int i = 0; i < pros.Count; i++) { var item = pros[i]; var mpro = modelType.GetSingleProperty(item.FieldName); string label = mpro.GetPropertyDisplayName(); string render = ""; string newname = item.FieldName; if (mpro.PropertyType.IsBoolOrNullableBool()) { render = "columnsRenderBoolean"; } if (string.IsNullOrEmpty(item.RelatedField) == false) { var subtype = Type.GetType(item.RelatedField); string prefix = ""; if (subtype == typeof(FileAttachment)) { if (item.FieldName.ToLower().Contains("photo") || item.FieldName.ToLower().Contains("pic") || item.FieldName.ToLower().Contains("icon")) { render = "columnsRenderImg"; rowheight = 110; } else { render = "columnsRenderDownload"; } var fk = DC.GetFKName2(modelType, item.FieldName); newname = fk; } else { var subpro = subtype.GetSingleProperty(item.SubField); existSubPro.Add(subpro); int count = existSubPro.Where(x => x.Name == subpro.Name).Count(); if (count > 1) { prefix = count + ""; } newname = item.SubField + "_view" + prefix; } } fieldstr.Append($@" {{ field: ""{newname}"", headerName: ""{label}"""); if (render != "") { fieldstr.Append($@", cellRenderer: ""{render}"" "); } fieldstr.Append($@" }}"); if (i < pros.Count - 1) { fieldstr.Append(','); } fieldstr.Append(Environment.NewLine); } return rv.Replace("$columns$", fieldstr.ToString()).Replace("$rowheight$", rowheight.ToString()); } if (name == "models") { StringBuilder fieldstr = new StringBuilder(); StringBuilder fieldstr2 = new StringBuilder(); var pros = FieldInfos.Where(x => x.IsFormField == true).ToList(); var pros2 = FieldInfos.Where(x => x.IsSearcherField == true).ToList(); //生成表单model for (int i = 0; i < pros.Count; i++) { var item = pros[i]; var property = modelType.GetSingleProperty(item.FieldName); string label = property.GetPropertyDisplayName(); bool isrequired = property.IsPropertyRequired(); var fktest = DC.GetFKName2(modelType, item.FieldName); if (string.IsNullOrEmpty(fktest) == false) { isrequired = modelType.GetSingleProperty(fktest).IsPropertyRequired(); } string rules = "rules: []"; if (isrequired == true) { rules = $@"rules: [{{ ""required"": true, ""message"": }}]"; } fieldstr.AppendLine($@" /** {label} */"); if (string.IsNullOrEmpty(item.RelatedField) == false && string.IsNullOrEmpty(item.SubIdField) == true) { var fk = DC.GetFKName2(modelType, item.FieldName); fieldstr.AppendLine($@" ""Entity.{fk}"":{{"); } else { fieldstr.AppendLine($@" ""Entity.{item.FieldName}"":{{"); } fieldstr.AppendLine($@" label: ""{label}"","); fieldstr.AppendLine($@" {rules},"); if (string.IsNullOrEmpty(item.RelatedField) == false) { var subtype = Type.GetType(item.RelatedField); if (item.SubField == "`file") { fieldstr.AppendLine($@" formItem: "); } else { if (string.IsNullOrEmpty(item.SubIdField) == true) { fieldstr.AppendLine($@" formItem: "); } else { fieldstr.AppendLine($@" formItem: "); } } } else { var proType = modelType.GetSingleProperty(item.FieldName)?.PropertyType; Type checktype = proType; if (proType.IsNullable()) { checktype = proType.GetGenericArguments()[0]; } if (checktype == typeof(bool)) { fieldstr.AppendLine($@" formItem: }} unCheckedChildren={{}} />"); } else if (checktype.IsEnum()) { var es = checktype.ToListItems(); fieldstr.AppendLine($@" formItem: "); } else if (checktype.IsNumber()) { fieldstr.AppendLine($@" formItem: "); } else if (checktype == typeof(string)) { fieldstr.AppendLine($@" formItem: "); } else if (checktype == typeof(DateTime)) { fieldstr.AppendLine($@" formItem: "); } } fieldstr.Append(" }"); if (i < pros.Count - 1) { fieldstr.Append(','); } fieldstr.Append(Environment.NewLine); } //生成searchmodel for (int i = 0; i < pros2.Count; i++) { var item = pros2[i]; if (item.SubField == "`file") { continue; } var property = modelType.GetSingleProperty(item.FieldName); string label = property.GetPropertyDisplayName(); string rules = "rules: []"; fieldstr2.AppendLine($@" /** {label} */"); if (string.IsNullOrEmpty(item.RelatedField) == false) { if (string.IsNullOrEmpty(item.SubIdField) == true) { var fk = DC.GetFKName2(modelType, item.FieldName); fieldstr2.AppendLine($@" ""{fk}"":{{"); } else { fieldstr2.AppendLine($@" ""Selected{item.FieldName}IDs"":{{"); } } else { fieldstr2.AppendLine($@" ""{item.FieldName}"":{{"); } fieldstr2.AppendLine($@" label: ""{label}"","); fieldstr2.AppendLine($@" {rules},"); if (string.IsNullOrEmpty(item.RelatedField) == false) { var subtype = Type.GetType(item.RelatedField); if (string.IsNullOrEmpty(item.SubIdField) == true) { fieldstr2.AppendLine($@" formItem: "); } else { fieldstr2.AppendLine($@" formItem: "); } } else { var proType = modelType.GetSingleProperty(item.FieldName)?.PropertyType; Type checktype = proType; if (proType.IsNullable()) { checktype = proType.GetGenericArguments()[0]; } if (checktype == typeof(bool)) { fieldstr2.AppendLine($@" formItem: , Value: true }},{{ Text: , Value: false }} ]}}/>"); } else if (checktype.IsEnum()) { var es = checktype.ToListItems(); fieldstr2.AppendLine($@" formItem: "); } else if (checktype.IsNumber()) { fieldstr2.AppendLine($@" formItem: "); } else if (checktype == typeof(string)) { fieldstr2.AppendLine($@" formItem: "); } else if (checktype == typeof(DateTime)) { fieldstr2.AppendLine($@" formItem: "); } } fieldstr2.Append(" }"); if (i < pros.Count - 1) { fieldstr2.Append(','); } fieldstr2.Append(Environment.NewLine); } return rv.Replace("$fields$", fieldstr.ToString()).Replace("$fields2$", fieldstr2.ToString()); } if (name == "search") { return rv; } if (name == "forms") { StringBuilder fieldstr = new StringBuilder(); var pros = FieldInfos.Where(x => x.IsFormField == true).ToList(); for (int i = 0; i < pros.Count; i++) { var item = pros[i]; if (string.IsNullOrEmpty(item.SubIdField)) { if (string.IsNullOrEmpty(item.RelatedField) == false) { var fk = DC.GetFKName2(modelType, item.FieldName); fieldstr.AppendLine($@" "); } else { var proType = modelType.GetSingleProperty(item.FieldName)?.PropertyType; Type checktype = proType; if (proType.IsNullable()) { checktype = proType.GetGenericArguments()[0]; } if (checktype == typeof(bool)) { fieldstr.AppendLine($@" "); } else { fieldstr.AppendLine($@" "); } } } else { fieldstr.AppendLine($@" "); } } return rv.Replace("$fields$", fieldstr.Replace("$switchdefaultvalue$", "value={false}").ToString()).Replace("$efields$", fieldstr.Replace("$switchdefaultvalue$", "").ToString()); } return rv; } public string GenerateVUEView(string name, List apineeded) { var rv = GetResource($"{name}.txt", "Spa.Vue") .Replace("$modelname$", ModelName.ToLower()); if (apineeded == null) { apineeded = new List(); } Type modelType = Type.GetType(SelectedModel); if (name == "config") { StringBuilder fieldstr = new StringBuilder(); StringBuilder enumstr = new StringBuilder(); var pros = FieldInfos.Where(x => x.IsListField == true || x.IsSearcherField == true).ToList(); fieldstr.Append(Environment.NewLine); List existSubPro = new List(); List existEnum = new List(); int rowheight = 30; for (int i = 0; i < pros.Count; i++) { var item = pros[i]; var mpro = modelType.GetSingleProperty(item.FieldName); string label = mpro.GetPropertyDisplayName(); string render = ""; string newname = item.FieldName; if (mpro.PropertyType.IsBoolOrNullableBool()) { render = "columnsRenderBoolean"; } if (string.IsNullOrEmpty(item.RelatedField) == false) { var subtype = Type.GetType(item.RelatedField); string prefix = ""; if (subtype == typeof(FileAttachment)) { if (item.FieldName.ToLower().Contains("photo") || item.FieldName.ToLower().Contains("pic") || item.FieldName.ToLower().Contains("icon")) { render = "columnsRenderImg"; rowheight = 110; } else { render = "columnsRenderDownload"; } var fk = DC.GetFKName2(modelType, item.FieldName); newname = fk; } else { var subpro = subtype.GetSingleProperty(item.SubField); existSubPro.Add(subpro); int count = existSubPro.Where(x => x.Name == subpro.Name).Count(); if (count > 1) { prefix = count + ""; } newname = item.SubField + "_view" + prefix; } } else { var proType = modelType.GetSingleProperty(item.FieldName)?.PropertyType; Type checktype = proType; if (proType.IsNullable()) { checktype = proType.GetGenericArguments()[0]; } if (checktype.IsEnum()) { if (existEnum.Contains(checktype.Name) == false) { var es = checktype.ToListItems(); enumstr.AppendLine($@"export const {item.FieldName}Types: Array = ["); for (int a = 0; a < es.Count; a++) { var e = es[a]; enumstr.Append($@" {{ Text: ""{e.Text}"", Value: ""{e.Value}"" }}"); if (a < es.Count - 1) { enumstr.Append(','); } enumstr.AppendLine(); } enumstr.AppendLine($@"];"); existEnum.Add(checktype.Name); } } } fieldstr.Append($@" {{ key: ""{newname}"", label: ""{label}"""); if (render != "") { fieldstr.Append($@", isSlot: true "); } fieldstr.Append($@" }}"); fieldstr.Append(','); } return rv.Replace("$fields$", fieldstr.ToString()).Replace("$rowheight$", rowheight.ToString()).Replace("$enums$", enumstr.ToString()); } if (name == "views.dialog-form") { StringBuilder fieldstr = new StringBuilder(); List actions = new List(); List enums = new List(); var pros = FieldInfos.Where(x => x.IsFormField == true).ToList(); //生成表单model for (int i = 0; i < pros.Count; i++) { var item = pros[i]; var property = modelType.GetSingleProperty(item.FieldName); string label = property.GetPropertyDisplayName(); bool isrequired = property.IsPropertyRequired(); var fktest = DC.GetFKName2(modelType, item.FieldName); if (string.IsNullOrEmpty(fktest) == false) { isrequired = modelType.GetSingleProperty(fktest).IsPropertyRequired(); } string rules = "rules: []"; if (isrequired == true) { rules = $@"rules: [{{ required: true, message: ""{label}""+this.$t(""form.notnull""),trigger: ""blur"" }}]"; } if (string.IsNullOrEmpty(item.RelatedField) == false && string.IsNullOrEmpty(item.SubIdField) == true) { var fk = DC.GetFKName2(modelType, item.FieldName); fieldstr.AppendLine($@" ""Entity.{fk}"":{{"); } else { fieldstr.AppendLine($@" ""Entity.{item.FieldName}"":{{"); } fieldstr.AppendLine($@" label: ""{label}"","); fieldstr.AppendLine($@" {rules},"); if (string.IsNullOrEmpty(item.RelatedField) == false) { var subtype = Type.GetType(item.RelatedField); if (item.SubField == "`file") { if (item.FieldName.ToLower().Contains("photo") || item.FieldName.ToLower().Contains("pic") || item.FieldName.ToLower().Contains("icon")) { fieldstr.AppendLine($@" type: ""wtmUploadImg"", props: {{ isHead: true, imageStyle: {{ width: ""100px"", height: ""100px"" }} }} "); } else { fieldstr.AppendLine($@" type: ""upload"""); } } else { if (string.IsNullOrEmpty(item.SubIdField) == true) { fieldstr.AppendLine($@" type: ""select"", children: this.get{subtype.Name}Data, props: {{ clearable: true }}"); } else { fieldstr.AppendLine($@" type: ""transfer"", mapKey: ""{item.SubIdField}"", props: {{ data: this.get{subtype.Name}Data.map(item => ({{ key: item.Value, label: item.Text }})), titles: [this.$t(""form.all""), this.$t(""form.selected"")], filterable: true, filterMethod: filterMethod }}, span: 24, defaultValue: []"); } apineeded.Add($"get{subtype.Name}"); actions.Add($"get{subtype.Name}"); } } else { var proType = modelType.GetSingleProperty(item.FieldName)?.PropertyType; Type checktype = proType; if (proType.IsNullable()) { checktype = proType.GetGenericArguments()[0]; } if (checktype == typeof(bool)) { fieldstr.AppendLine($@" type: ""switch"""); } else if (checktype.IsEnum()) { fieldstr.AppendLine($@" type: ""select"", children: {item.FieldName}Types, props: {{ clearable: true }}"); enums.Add(item.FieldName + "Types"); } else if (checktype.IsNumber()) { fieldstr.AppendLine($@" type: ""input"""); } else if (checktype == typeof(string)) { fieldstr.AppendLine($@" type: ""input"""); } else if (checktype == typeof(DateTime)) { fieldstr.AppendLine($@" type: ""datePicker"""); } } fieldstr.Append(" }"); if (i < pros.Count - 1) { fieldstr.Append(','); } fieldstr.Append(Environment.NewLine); } string a1 = ""; string a2 = ""; foreach (var item in actions.Distinct()) { a1 += $@" @Action {item}; @State {item}Data; "; a2 += $@" this.{item}(); "; } string import = ""; if (enums.Count > 0) { import = $@"import {{ {enums.Distinct().ToSepratedString()} }} from ""../config"";"; } return rv.Replace("$fields$", fieldstr.ToString()).Replace("$actions$", a1).Replace("$runactions$", a2).Replace("$import$", import); } if (name == "index") { StringBuilder fieldstr2 = new StringBuilder(); StringBuilder actions = new StringBuilder(); List acts = new List(); List enums = new List(); var pros2 = FieldInfos.Where(x => x.IsSearcherField == true || x.IsListField).ToList(); int searchcount = 0; for (int i = 0; i < pros2.Count; i++) { var item = pros2[i]; if (item.IsListField == true) { var mpro = modelType.GetSingleProperty(item.FieldName); if (mpro.PropertyType.IsBoolOrNullableBool()) { actions.AppendLine($@" "); } if (string.IsNullOrEmpty(item.RelatedField) == false) { var subtype = Type.GetType(item.RelatedField); var fk = DC.GetFKName2(modelType, item.FieldName); if (subtype == typeof(FileAttachment)) { if (item.FieldName.ToLower().Contains("photo") || item.FieldName.ToLower().Contains("pic") || item.FieldName.ToLower().Contains("icon")) { actions.AppendLine($@" "); } else { actions.AppendLine($@" "); } } } } if (item.IsSearcherField == true) { if (item.SubField == "`file") { continue; } searchcount++; var property = modelType.GetSingleProperty(item.FieldName); string label = property.GetPropertyDisplayName(); string rules = "rules: []"; if (string.IsNullOrEmpty(item.RelatedField) == false) { if (string.IsNullOrEmpty(item.SubIdField) == true) { var fk = DC.GetFKName2(modelType, item.FieldName); fieldstr2.AppendLine($@" ""{fk}"":{{"); } else { fieldstr2.AppendLine($@" ""Selected{item.FieldName}IDs"":{{"); } } else { fieldstr2.AppendLine($@" ""{item.FieldName}"":{{"); } fieldstr2.AppendLine($@" label: ""{label}"","); fieldstr2.AppendLine($@" {rules},"); if (string.IsNullOrEmpty(item.RelatedField) == false) { var subtype = Type.GetType(item.RelatedField); if (string.IsNullOrEmpty(item.SubIdField) == true) { fieldstr2.AppendLine($@" type: ""select"", children: this.get{subtype.Name}Data, props: {{ clearable: true, placeholder: '全部' }}"); } else { fieldstr2.AppendLine($@" type: ""select"", children: this.get{subtype.Name}Data, props: {{ clearable: true , multiple: true, ""collapse-tags"": true }}"); } apineeded.Add($"get{subtype.Name}"); acts.Add($"get{subtype.Name}"); } else { var proType = modelType.GetSingleProperty(item.FieldName)?.PropertyType; Type checktype = proType; if (proType.IsNullable()) { checktype = proType.GetGenericArguments()[0]; } if (checktype == typeof(bool)) { fieldstr2.AppendLine($@" type: ""switch"""); } else if (checktype.IsEnum()) { fieldstr2.AppendLine($@" type: ""select"", children: {item.FieldName}Types, props: {{ clearable: true, placeholder: this.$t(""form.all"") }}"); enums.Add(item.FieldName + "Types"); } else if (checktype.IsNumber()) { fieldstr2.AppendLine($@" type: ""input"""); } else if (checktype == typeof(string)) { fieldstr2.AppendLine($@" type: ""input"""); } else if (checktype == typeof(DateTime)) { fieldstr2.AppendLine($@" type: ""datePicker"", span: 12, props: {{ type: ""datetimerange"", ""value-format"": ""yyyy-MM-dd HH:mm:ss"", ""range-separator"": ""-"", ""start-placeholder"": this.$t(""table.startdate""), ""end-placeholder"": this.$t(""table.enddate"") }}"); } } if (searchcount > 2) { fieldstr2.AppendLine(" ,isHidden: !this.isActive"); } fieldstr2.Append(" },"); fieldstr2.Append(Environment.NewLine); } } string a1 = ""; string a2 = ""; foreach (var item in acts.Distinct()) { a1 += $@" @Action {item}; @State {item}Data; "; a2 += $@" this.{item}(); "; } return rv.Replace("$fields$", fieldstr2.ToString()).Replace("$actions$", actions.ToString()).Replace("$enums$", enums.Distinct().ToSepratedString()) .Replace("$acts$", a1).Replace("$runactions$", a2); } if (name == "store.api") { StringBuilder fieldstr = new StringBuilder(); StringBuilder efieldstr = new StringBuilder(); var apis = apineeded.Distinct().ToList(); for (int i = 0; i < apis.Count; i++) { var item = apis[i]; fieldstr.AppendLine($@"const {item} = {{ url: reqPath + ""{item}s"", method: ""get"", dataType: ""array"" }}; "); efieldstr.AppendLine($"{item},"); } return rv.Replace("$fields$", fieldstr.ToString()).Replace("$efields$", efieldstr.ToString()); } return rv; } public string GenerateBlazorView(string name) { string pagepath = string.IsNullOrEmpty(Area) ? $"/{ModelName}" : $"/{Area}/{ModelName}"; if(name != "Index") { pagepath += $"/{name}"; } if (name == "Edit" || name == "Details") { pagepath += "/{id}"; } var rv = GetResource($"{name}.txt", "Spa.Blazor") .Replace("$modelname$", ModelName) .Replace("$vmnamespace$", VMNs) .Replace("$des$", ModuleName) .Replace("$controllername$", $"{ControllerNs},{ModelName}") .Replace("$pagepath$", pagepath); Type modelType = Type.GetType(SelectedModel); if (name == "Index") { StringBuilder fieldstr = new StringBuilder(); StringBuilder fieldstr2 = new StringBuilder(); var pros = FieldInfos.Where(x => x.IsListField == true).ToList(); var pros2 = FieldInfos.Where(x => x.IsSearcherField == true).ToList(); List existSubPro = new List(); Dictionary apis = new Dictionary(); Dictionary multiapis = new Dictionary(); for (int i = 0; i < pros.Count; i++) { var item = pros[i]; var mpro = modelType.GetSingleProperty(item.FieldName); string render = ""; string template = ""; string newname = item.FieldName; if (mpro.PropertyType.IsBoolOrNullableBool()) { if (mpro.PropertyType.IsNullable()) { render = "ComponentType=\"@typeof(NullSwitch)\""; } else { render = "ComponentType=\"@typeof(Switch)\""; } } if (mpro.PropertyType == typeof(DateTime) || mpro.PropertyType == typeof(DateTime?)) { render = "FormatString=\"yyyy-MM-dd HH: mm: ss\""; } if (string.IsNullOrEmpty(item.RelatedField) == false) { var subtype = Type.GetType(item.RelatedField); string prefix = ""; if (subtype == typeof(FileAttachment)) { if (item.FieldName.ToLower().Contains("photo") || item.FieldName.ToLower().Contains("pic") || item.FieldName.ToLower().Contains("icon") || item.FieldName.ToLower().Contains("zhaopian") || item.FieldName.ToLower().Contains("tupian")) { template = @" "; } else { template = @" "; } var fk = DC.GetFKName2(modelType, item.FieldName); newname = fk; } else { var subpro = subtype.GetSingleProperty(item.SubField); existSubPro.Add(subpro); int count = existSubPro.Where(x => x.Name == subpro.Name).Count(); if (count > 1) { prefix = count + ""; } newname = item.SubField + "_view" + prefix; } } if (template == "") { fieldstr.Append($@" "); } else { fieldstr.Append($@" {template} "); } } for (int i = 0; i < pros2.Count; i++) { string controltype = "BootstrapInput"; string sitems = ""; string bindfield = ""; string ph = ""; var item = pros2[i]; if (item.SubField == "`file") { continue; } if (string.IsNullOrEmpty(item.RelatedField) == false) { if (string.IsNullOrEmpty(item.SubIdField) == true) { var fk = DC.GetFKName2(modelType, item.FieldName); bindfield = fk; } else { bindfield = $"Selected{item.FieldName}IDs"; } } else { bindfield = item.FieldName; } if (string.IsNullOrEmpty(item.RelatedField) == false) { var subtype = Type.GetType(item.RelatedField); if (string.IsNullOrEmpty(item.SubIdField) == true) { controltype = "Select"; } else { controltype = "MultiSelect"; } var tempname = $"All{subtype.Name}s"; sitems = $"Items=\"@{tempname}\""; if (apis.ContainsKey(tempname) == false && multiapis.ContainsKey(tempname) == false) { if (controltype == "Select") { apis.Add(tempname, $"/api/{ModelName}/Get{subtype.Name}s"); } else { multiapis.Add(tempname, $"/api/{ModelName}/Get{subtype.Name}s"); } } } else { var proType = modelType.GetSingleProperty(item.FieldName)?.PropertyType; Type checktype = proType; if (proType.IsNullable()) { checktype = proType.GetGenericArguments()[0]; } if (checktype == typeof(bool)) { controltype = "Select"; sitems = "Items=\"@WtmBlazor.GlobalSelectItems.SearcherBoolItems\""; } else if (checktype.IsEnum()) { controltype = "Select"; } else if (checktype.IsNumber()) { controltype = "BootstrapInputNumber"; } else if (checktype == typeof(string)) { } else if (checktype == typeof(DateTime)) { controltype = "WTDateRange"; } } if(controltype == "Select" || controltype == "MultiSelect") { ph = "PlaceHolder=\"@WtmBlazor.Localizer[\"Sys.All\"]\""; } fieldstr2.Append($@" <{controltype} @bind-Value=""@SearchModel.{bindfield}"" {sitems} {ph}/>"); } StringBuilder apiinit = new StringBuilder(); StringBuilder fieldinit = new StringBuilder(); foreach (var item in apis) { apiinit.Append(@$" {item.Key} = await WtmBlazor.Api.CallItemsApi(""{item.Value}"", placeholder: WtmBlazor.Localizer[""Sys.All""]); "); fieldinit.Append($@" private List {item.Key} = new List(); "); } foreach (var item in multiapis) { apiinit.Append(@$" {item.Key} = await WtmBlazor.Api.CallItemsApi(""{item.Value}""); "); fieldinit.Append($@" private List {item.Key} = new List(); "); } return rv.Replace("$columns$", fieldstr.ToString()).Replace("$searchfields$",fieldstr2.ToString()).Replace("$init$", apiinit.ToString()).Replace("$fieldinit$", fieldinit.ToString()); } if (name == "Create" || name == "Edit") { StringBuilder fieldstr = new StringBuilder(); var pros = FieldInfos.Where(x => x.IsFormField == true).ToList(); //生成表单model Dictionary apis = new Dictionary(); Dictionary multiapis = new Dictionary(); for (int i = 0; i < pros.Count; i++) { var item = pros[i]; string controltype = "BootstrapInput"; string sitems = ""; string bindfield = ""; string ph = ""; var property = modelType.GetSingleProperty(item.FieldName); if (string.IsNullOrEmpty(item.RelatedField) == false) { if (string.IsNullOrEmpty(item.SubIdField) == true) { var fk = DC.GetFKName2(modelType, item.FieldName); bindfield = "Entity." + fk; } else { bindfield = $"Selected{item.FieldName}IDs"; } } else { bindfield = "Entity."+ item.FieldName; } if (string.IsNullOrEmpty(item.RelatedField) == false) { var subtype = Type.GetType(item.RelatedField); if (item.SubField == "`file") { if (item.FieldName.ToLower().Contains("photo") || item.FieldName.ToLower().Contains("pic") || item.FieldName.ToLower().Contains("icon") || item.FieldName.ToLower().Contains("zhaopian") || item.FieldName.ToLower().Contains("tupian")) { controltype = "WTUploadImage"; } else { controltype = "WTUploadFile"; } } else { if (string.IsNullOrEmpty(item.SubIdField) == true) { controltype = "Select"; } else { controltype = "Transfer"; } var tempname = $"All{subtype.Name}s"; sitems = $"Items=\"@{tempname}\""; if (apis.ContainsKey(tempname) == false && multiapis.ContainsKey(tempname) == false) { if (controltype == "Select") { apis.Add(tempname, $"/api/{ModelName}/Get{subtype.Name}s"); } else { multiapis.Add(tempname, $"/api/{ModelName}/Get{subtype.Name}s"); } } } } else { var proType = modelType.GetSingleProperty(item.FieldName)?.PropertyType; Type checktype = proType; if (proType.IsNullable()) { checktype = proType.GetGenericArguments()[0]; } if (checktype == typeof(bool)) { if (proType.IsNullable()) { controltype = "NullSwitch"; } else { controltype = "Switch"; } } else if (checktype.IsEnum()) { controltype = "Select"; } else if (checktype.IsNumber()) { controltype = "BootstrapInputNumber"; } else if (checktype == typeof(string)) { } else if (checktype == typeof(DateTime)) { controltype = "DateTimePicker"; } } if (controltype == "Select" || controltype == "MultiSelect") { ph = "PlaceHolder=\"@WtmBlazor.Localizer[\"Sys.PleaseSelect\"]\""; } if (controltype == "Transfer") { fieldstr.Append($@" <{controltype} @bind-Value=""@Model.{bindfield}"" {sitems} {ph}/> "); } else { fieldstr.Append($@" <{controltype} @bind-Value=""@Model.{bindfield}"" {sitems} {ph}/>"); } } StringBuilder apiinit = new StringBuilder(); StringBuilder fieldinit = new StringBuilder(); foreach (var item in apis) { apiinit.Append(@$" {item.Key} = await WtmBlazor.Api.CallItemsApi(""{item.Value}"", placeholder: WtmBlazor.Localizer[""Sys.PleaseSelect""]); "); fieldinit.Append($@" private List {item.Key} = new List(); "); } foreach (var item in multiapis) { apiinit.Append(@$" {item.Key} = await WtmBlazor.Api.CallItemsApi(""{item.Value}""); "); fieldinit.Append($@" private List {item.Key} = new List(); "); } return rv.Replace("$formfields$", fieldstr.ToString()).Replace("$fieldinit$", fieldinit.ToString()).Replace("$init$", apiinit.ToString()); } if (name == "Details") { StringBuilder fieldstr = new StringBuilder(); var pros = FieldInfos.Where(x => x.IsFormField == true).ToList(); //生成表单model Dictionary apis = new Dictionary(); for (int i = 0; i < pros.Count; i++) { var item = pros[i]; string controltype = "Display"; string sitems = ""; string bindfield = ""; string disabled = ""; var property = modelType.GetSingleProperty(item.FieldName); if (string.IsNullOrEmpty(item.RelatedField) == false) { if (string.IsNullOrEmpty(item.SubIdField) == true) { var fk = DC.GetFKName2(modelType, item.FieldName); bindfield = "Entity." + fk; } else { bindfield = $"Selected{item.FieldName}IDs"; } } else { bindfield = "Entity." + item.FieldName; } if (string.IsNullOrEmpty(item.RelatedField) == false) { var subtype = Type.GetType(item.RelatedField); if (item.SubField == "`file") { if (item.FieldName.ToLower().Contains("photo") || item.FieldName.ToLower().Contains("pic") || item.FieldName.ToLower().Contains("icon") || item.FieldName.ToLower().Contains("zhaopian") || item.FieldName.ToLower().Contains("tupian")) { controltype = "WTUploadImage"; } else { controltype = "WTUploadFile"; } disabled = "IsDisabled=\"true\""; } else { var tempname = $"All{subtype.Name}s"; sitems = $"Lookup=\"@{tempname}\""; if (apis.ContainsKey(tempname) == false) { apis.Add(tempname, $"/api/{ModelName}/Get{subtype.Name}s"); } } } else { var proType = modelType.GetSingleProperty(item.FieldName)?.PropertyType; Type checktype = proType; if (proType.IsNullable()) { checktype = proType.GetGenericArguments()[0]; } if (checktype == typeof(bool)) { if (proType.IsNullable()) { controltype = "NullSwitch"; } else { controltype = "Switch"; } disabled = "IsDisabled=\"true\""; } } if (controltype == "WTUploadFile") { string label = property.GetPropertyDisplayName(); fieldstr.Append($@" @if (Model.{bindfield}.HasValue){{
}} "); } else { fieldstr.Append($@" <{controltype} @bind-Value=""@Model.{bindfield}"" {sitems} {disabled} ShowLabel=""true""/>"); } } StringBuilder apiinit = new StringBuilder(); StringBuilder fieldinit = new StringBuilder(); foreach (var item in apis) { apiinit.Append(@$" {item.Key} = await WtmBlazor.Api.CallItemsApi(""{item.Value}"", placeholder: WtmBlazor.Localizer[""Sys.All""]); "); fieldinit.Append($@" private List {item.Key} = new List(); "); } return rv.Replace("$formfields$", fieldstr.ToString()).Replace("$fieldinit$", fieldinit.ToString()).Replace("$init$", apiinit.ToString()); } return rv; } public string GetResource(string fileName, string subdir = "") { //获取编译在程序中的Controller原始代码文本 Assembly assembly = Assembly.GetExecutingAssembly(); string loc = ""; if (string.IsNullOrEmpty(subdir)) { loc = $"WalkingTec.Mvvm.Mvc.GeneratorFiles.{fileName}"; } else { loc = $"WalkingTec.Mvvm.Mvc.GeneratorFiles.{subdir}.{fileName}"; } var textStreamReader = new StreamReader(assembly.GetManifestResourceStream(loc)); string content = textStreamReader.ReadToEnd(); textStreamReader.Close(); return content; } private string GetRelatedNamespace(List pros, string s) { string otherns = @""; Type modelType = Type.GetType(SelectedModel); foreach (var pro in pros) { Type proType = null; if (string.IsNullOrEmpty(pro.RelatedField)) { proType = modelType.GetSingleProperty(pro.FieldName)?.PropertyType; } else { proType = Type.GetType(pro.RelatedField); } string prons = proType.Namespace; if (proType.IsNullable()) { prons = proType.GetGenericArguments()[0].Namespace; } if (s.Contains($"using {prons};") == false && otherns.Contains($"using {prons};") == false) { otherns += $@"using {prons}; "; } } return s.Replace("$othernamespace$", otherns); } } public enum FieldInfoType { Normal, One2Many, Many2Many } public class FieldInfo { public string FieldName { get; set; } public string RelatedField { get; set; } public bool IsSearcherField { get; set; } public bool IsListField { get; set; } public bool IsFormField { get; set; } public bool IsImportField { get; set; } public bool IsBatchField { get; set; } public FieldInfoType InfoType { get { if (string.IsNullOrEmpty(RelatedField)) { return FieldInfoType.Normal; } else { if (string.IsNullOrEmpty(SubIdField)) { return FieldInfoType.One2Many; } else { return FieldInfoType.Many2Many; } } } } /// /// 字段关联的类名 /// public string SubField { get; set; } /// /// 多对多关系时,记录中间表关联到主表的字段名称 /// public string SubIdField { get; set; } public string GetField(IDataContext DC, Type modelType) { if (this.InfoType == FieldInfoType.One2Many) { var fk = DC.GetFKName2(modelType, this.FieldName); return fk; } else { return this.FieldName; } } public string GetFKType(IDataContext DC, Type modelType) { Type fktype = null; if (this.InfoType == FieldInfoType.One2Many) { var fk = this.GetField(DC, modelType); fktype = modelType.GetSingleProperty(fk)?.PropertyType; } if (this.InfoType == FieldInfoType.Many2Many) { var middletype = modelType.GetSingleProperty(this.FieldName)?.PropertyType; fktype = middletype.GetGenericArguments()[0].GetSingleProperty(this.SubIdField)?.PropertyType; } var typename = "string"; if (fktype == typeof(short) || fktype == typeof(short?)) { typename = "short"; } if (fktype == typeof(int) || fktype == typeof(int?)) { typename = "int"; } if (fktype == typeof(long) || fktype == typeof(long?)) { typename = "long"; } if (fktype == typeof(Guid) || fktype == typeof(Guid?)) { typename = "Guid"; } return typename; } } }