diff --git a/visualdev/Tnb.Vengine/Atrributes/VmodelSettingAttribute.cs b/common/Tnb.Common/Atrributes/VmodelAttribute.cs similarity index 66% rename from visualdev/Tnb.Vengine/Atrributes/VmodelSettingAttribute.cs rename to common/Tnb.Common/Atrributes/VmodelAttribute.cs index 043bf4b3..5c6178b9 100644 --- a/visualdev/Tnb.Vengine/Atrributes/VmodelSettingAttribute.cs +++ b/common/Tnb.Common/Atrributes/VmodelAttribute.cs @@ -4,17 +4,17 @@ /// 字典对象 /// [AttributeUsage(AttributeTargets.Class)] -public class VmodelSettingAttribute : Attribute +public class VmodelAttribute : Attribute { public string? Id { get; set; } public string? Area { get; set; } public string? Code { get; set; } - public VmodelSettingAttribute(string id) + public VmodelAttribute(string id) { Id = id; } - public VmodelSettingAttribute(string area, string? code = null) + public VmodelAttribute(string area, string? code) { Area = area; Code = code; diff --git a/common/Tnb.Common/Contracts/BaseEntity`1.cs b/common/Tnb.Common/Contracts/BaseEntity`1.cs index 1f20b6e3..7f220fb4 100644 --- a/common/Tnb.Common/Contracts/BaseEntity`1.cs +++ b/common/Tnb.Common/Contracts/BaseEntity`1.cs @@ -1,8 +1,9 @@ using SqlSugar; +using Tnb; namespace JNPF.Common.Contracts; -public class BaseEntity : IEntity where TKey : IEquatable +public class BaseEntity : Entity, IEntity where TKey : IEquatable { /// /// 获取或设置 编号. @@ -10,6 +11,8 @@ public class BaseEntity : IEntity where TKey : IEquatable [SugarColumn(ColumnName = "id", ColumnDescription = "主键", IsPrimaryKey = true)] public TKey id { get; set; } - - + public override object[] GetKeys() + { + return [id]; + } } diff --git a/visualdev/Tnb.Vengine/Domain/Entity.cs b/common/Tnb.Common/Contracts/Entity.cs similarity index 96% rename from visualdev/Tnb.Vengine/Domain/Entity.cs rename to common/Tnb.Common/Contracts/Entity.cs index c9b2906e..19f7378b 100644 --- a/visualdev/Tnb.Vengine/Domain/Entity.cs +++ b/common/Tnb.Common/Contracts/Entity.cs @@ -5,7 +5,7 @@ using JNPF.Common.Contracts; -namespace Tnb.Vengine.Domain; +namespace Tnb; [Serializable] public abstract class Entity : IEntity diff --git a/common/Tnb.Common/Models/DObject.cs b/common/Tnb.Common/Models/DObject.cs index d17f8375..855353d2 100644 --- a/common/Tnb.Common/Models/DObject.cs +++ b/common/Tnb.Common/Models/DObject.cs @@ -1,4 +1,7 @@ -namespace Tnb.Core; +using Mapster; +using SqlSugar; + +namespace Tnb.Core; /// /// 字典对象 @@ -13,33 +16,35 @@ public class DObject : Dictionary public DObject(Dictionary dictionary) : base(dictionary) { } - public void AddCascade(string code, object value) + + /// + /// 将平面结构转换为树形嵌套结构 + /// + /// 以.号分隔的多级路径 + /// + public void AddToCascade(string codePath, object value) { - var keys = code.Split('.'); + var keys = codePath.Split('.'); if (keys.Length == 1) { - Add(code, value); + Add(codePath, value); return; } + DObject temp = this; for (int i = 0; i < keys.Length; i++) { - DObject temp = this; + var key = keys[i]; if (i < keys.Length - 1) { - if (!ContainsKey(keys[i])) - { - temp = new DObject(); - Add(keys[i], temp); - } - else - { - temp = (DObject)temp[keys[i]]; - } + var obj = new DObject(); + temp[key] = obj; + temp = obj; } else { - temp.Add(keys[i], value); + temp[key] = value; } } } + } diff --git a/visualdev/Tnb.Vengine/AppService/VengineAppService.cs b/visualdev/Tnb.Vengine/AppService/VengineAppService.cs index eacb95fa..73b86859 100644 --- a/visualdev/Tnb.Vengine/AppService/VengineAppService.cs +++ b/visualdev/Tnb.Vengine/AppService/VengineAppService.cs @@ -24,6 +24,7 @@ public class VengineAppService : BaseAppService, IVengineAppService { private readonly IDataAccess _dataAccess; private readonly ISqlSugarClient _db; + private readonly Dictionary _models = new(); /// /// 构造函数 @@ -34,6 +35,19 @@ public class VengineAppService : BaseAppService, IVengineAppService _db = _dataAccess.GetSqlSugar(); } + /// + /// 获取Vmodel + /// + private async Task GetVmodelAsync(string id) + { + if (_models.ContainsKey(id)) + { + _models[id] = await _dataAccess.GetVmodelAsync(id, false); + } + return _models[id]; + } + + #region 按模型的id进行增删改查接口 /// @@ -42,14 +56,9 @@ public class VengineAppService : BaseAppService, IVengineAppService [HttpGet("api/[area]/[controller]/{vmid}/get")] public async Task GetAsync(string vmid, [FromQuery] VmGetInput input) { - var vm = await _dataAccess.GetVmodelAsync(vmid, true); - VmQueryInput arg = input.Adapt(); - if (input.id != null) - { - if (arg.q == null) arg.q = new DObject(); - arg.q.Add(vm.GetPrimary().code, input.id); - } - var ls = await _dataAccess.QueryDataAsync(vm, arg); + var vm = await GetVmodelAsync(vmid); + var arg = input.ToQueryInput(vm.GetPrimary().code); + var ls = await ListAsync(vmid, arg); return ls.items.FirstOrDefault(); } @@ -59,14 +68,7 @@ public class VengineAppService : BaseAppService, IVengineAppService [HttpGet("api/[area]/[controller]/{vmid}/get-list")] public async Task GetListAsync(string vmid, [FromQuery] VmGetListInput input) { - var vm = await _dataAccess.GetVmodelAsync(vmid, true); - VmQueryInput arg = input.Adapt(); - if (!string.IsNullOrEmpty(input.q)) - { - arg.q = input.q.ToObject(); - } - var ls = await _dataAccess.QueryDataAsync(vm, arg); - return ls; + return await ListAsync(vmid, input.ToQueryInput()); } /// @@ -75,7 +77,7 @@ public class VengineAppService : BaseAppService, IVengineAppService [HttpPost("api/[area]/[controller]/{vmid}/list")] public async Task ListAsync(string vmid, [FromBody] VmQueryInput input) { - var vm = await _dataAccess.GetVmodelAsync(vmid, true); + var vm = await GetVmodelAsync(vmid); var ls = await _dataAccess.QueryDataAsync(vm, input); return ls; } @@ -86,7 +88,7 @@ public class VengineAppService : BaseAppService, IVengineAppService [HttpPost("api/[area]/[controller]/{vmid}/create")] public async Task CreateAsync(string vmid, [FromBody] VmCreateInput input) { - var vm = await _dataAccess.GetVmodelAsync(vmid); + var vm = await GetVmodelAsync(vmid); var ret = await _dataAccess.CreateDataAsync(vm, input); return ret; } @@ -97,7 +99,7 @@ public class VengineAppService : BaseAppService, IVengineAppService [HttpPut("api/[area]/[controller]/{vmid}/update")] public async Task UpdateAsync(string vmid, [FromBody] VmUpdateInput input) { - var vm = await _dataAccess.GetVmodelAsync(vmid); + var vm = await GetVmodelAsync(vmid); var ret = await _dataAccess.UpdateDataAsync(vm, input); return ret; } @@ -108,7 +110,7 @@ public class VengineAppService : BaseAppService, IVengineAppService [HttpDelete("api/[area]/[controller]/{vmid}/delete")] public async Task DeleteAsync(string vmid, [FromQuery] VmDeleteInput input) { - var vm = await _dataAccess.GetVmodelAsync(vmid); + var vm = await GetVmodelAsync(vmid); var ret = await _dataAccess.DeleteDataAsync(vm, input); return ret; } @@ -119,8 +121,12 @@ public class VengineAppService : BaseAppService, IVengineAppService private async Task GetVmodelAsync(string areaCode, string vmCode) { - var vm = await _dataAccess.GetVmodelAsync(areaCode, vmCode, false); - return vm; + var key = areaCode + "/" + vmCode; + if (_models.ContainsKey(key)) + { + _models[key] = await _dataAccess.GetVmodelAsync(areaCode, vmCode, false); + } + return _models[key]; } /// @@ -130,13 +136,8 @@ public class VengineAppService : BaseAppService, IVengineAppService public async Task GetAsync(string areaCode, string vmCode, [FromQuery] VmGetInput input) { var vm = await GetVmodelAsync(areaCode, vmCode); - VmQueryInput arg = input.Adapt(); - if (input.id != null) - { - if (arg.q == null) arg.q = new DObject(); - arg.q.Add(vm.GetPrimary().code, input.id); - } - var ls = await _dataAccess.QueryDataAsync(vm, arg); + var arg = input.ToQueryInput(vm.GetPrimary().code); + var ls = await ListAsync(areaCode, vmCode, arg); return ls.items.FirstOrDefault(); } @@ -146,14 +147,7 @@ public class VengineAppService : BaseAppService, IVengineAppService [HttpGet("api/{areaCode}/{vmCode}/get-list")] public async Task GetListAsync(string areaCode, string vmCode, [FromQuery] VmGetListInput input) { - var vm = await GetVmodelAsync(areaCode, vmCode); - VmQueryInput arg = input.Adapt(); - if (!string.IsNullOrEmpty(input.q)) - { - arg.q = input.q.ToObject(); - } - var ls = await _dataAccess.QueryDataAsync(vm, arg); - return ls; + return await ListAsync(areaCode, vmCode, input.ToQueryInput()); } /// diff --git a/visualdev/Tnb.Vengine/AppService/VengineAppServiceT.cs b/visualdev/Tnb.Vengine/AppService/VengineAppServiceT.cs index dc69c995..be4b17b3 100644 --- a/visualdev/Tnb.Vengine/AppService/VengineAppServiceT.cs +++ b/visualdev/Tnb.Vengine/AppService/VengineAppServiceT.cs @@ -4,6 +4,9 @@ ///////////////////////////////////////////////////////////////////////////////// using System.Reflection; +using System.Security.Cryptography; +using Aop.Api.Domain; +using JNPF.Common.Contracts; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -20,10 +23,17 @@ namespace Tnb.Vengine.AppService; [Authorize] //[ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 1102)] [Route("api/[area]/[controller]/[action]")] -public class VengineAppService : BaseAppService where TEntity : Entity +public class VengineAppService : BaseAppService + where TEntity : Entity + where TGetInput : VmGetInput + where TQueryInput : VmQueryInput + where TGetListInput : VmGetListInput + where TCreateInput : VmCreateInput + where TUpdateInput : VmUpdateInput { protected readonly IDataAccess _dataAccess; protected readonly ISqlSugarClient _db; + private readonly Dictionary _models = new(); /// /// 构造函数 @@ -37,71 +47,86 @@ public class VengineAppService : BaseAppService where TEntity : Entity protected virtual async Task GetVmodelAsync() { var tp = typeof(TEntity); - string? area = null, code = null; - var vset = tp.GetCustomAttribute(); + string? id = null, area = null, code = null; + var vset = tp.GetCustomAttribute(); if (vset != null) { + id = vset.Id; area = vset.Area; code = vset.Code; } - if (string.IsNullOrEmpty(area)) + if (!string.IsNullOrEmpty(id)) { - ThrowIf.IsNullOrEmpty(tp.Namespace, $"类型 {nameof(tp)} 的命名空间不可为空"); - area = tp.Namespace.RemovePreFix(ModuleConst.NsPrefix + ".").Replace(".Domain", "").Replace(".Entities", "").ToKebab(); + if (_models.ContainsKey(id)) + { + _models[id] = await _dataAccess.GetVmodelAsync(id, false); + //_models[_models[id].fullCode] = _models[id]; + } + return _models[id]; } - if (string.IsNullOrEmpty(code)) + else { - code = tp.Name.ToKebab(); + if (string.IsNullOrEmpty(area)) + { + ThrowIf.IsNullOrEmpty(tp.Namespace, $"类型 {nameof(tp)} 的命名空间不可为空"); + area = tp.Namespace.RemovePreFix(ModuleConst.NsPrefix + ".").Replace(".Domain", "").Replace(".Entities", "").ToKebab(); + } + if (string.IsNullOrEmpty(code)) + { + code = tp.Name.ToKebab(); + } + var key = area + "/" + code; + if (_models.ContainsKey(key)) + { + _models[key] = await _dataAccess.GetVmodelAsync(area, code, false); + } + return _models[key]; } - var vm = await _dataAccess.GetVmodelAsync(area, code, false); - - return vm; } /// /// 获取一条 数据信息 /// [HttpGet] - public virtual async Task GetAsync([FromQuery] VmGetInput input) + public virtual async Task GetAsync([FromQuery] TGetInput input) { var vm = await GetVmodelAsync(); - VmQueryInput arg = input.Adapt(); + TQueryInput arg = input.Adapt(); if (input.id != null) { if (arg.q == null) arg.q = new DObject(); arg.q.Add(vm.GetPrimary().code, input.id); } - var ls = await _dataAccess.QueryDataAsync(vm, arg); - return ls.items.FirstOrDefault()!; + + var data = (await ListAsync(arg)).items.FirstOrDefault(); + return data == null ? default! : data.Adapt(); } /// /// 获取多条 数据列表 /// [HttpGet] - public virtual async Task GetListAsync([FromQuery] VmGetListInput input) + public virtual async Task> GetListAsync([FromQuery] TGetListInput input) { - var vm = await GetVmodelAsync(); - var ls = await _dataAccess.QueryDataAsync(vm, input.ToListInput()); - return ls; + return await ListAsync(input.Adapt()); } /// /// 获取多条 数据列表 /// [HttpPost] - public virtual async Task ListAsync([FromBody] VmQueryInput input) + public virtual async Task> ListAsync([FromBody] TQueryInput input) { var vm = await GetVmodelAsync(); var ls = await _dataAccess.QueryDataAsync(vm, input); - return ls; + return ls.ToPagedOutput(); } /// /// 新增 数据 /// [HttpPost] - public virtual async Task CreateAsync([FromBody] VmCreateInput input) + public virtual async Task CreateAsync([FromBody] TCreateInput input) { var vm = await GetVmodelAsync(); var ret = await _dataAccess.CreateDataAsync(vm, input); @@ -112,7 +137,7 @@ public class VengineAppService : BaseAppService where TEntity : Entity /// 更新 数据 /// [HttpPut] - public virtual async Task UpdateAsync([FromBody] VmUpdateInput input) + public virtual async Task UpdateAsync([FromBody] TUpdateInput input) { var vm = await GetVmodelAsync(); var ret = await _dataAccess.UpdateDataAsync(vm, input); @@ -129,4 +154,47 @@ public class VengineAppService : BaseAppService where TEntity : Entity var ret = await _dataAccess.DeleteDataAsync(vm, input); return ret; } -} \ No newline at end of file +} + +#region 泛型变种 +public class VengineAppService : + VengineAppService + where TEntity : Entity + where TGetInput : VmGetInput + where TGetListInput : VmGetListInput + where TQueryInput : VmQueryInput +{ + public VengineAppService(IDataAccess da) : base(da) + { + } +} +public class VengineAppService : + VengineAppService + where TEntity : Entity + where TGetInput : VmGetInput + where TGetListInput : VmGetListInput + where TQueryInput : VmQueryInput +{ + public VengineAppService(IDataAccess da) : base(da) + { + } +} +public class VengineAppService : + VengineAppService + where TEntity : Entity + where TGetInput : VmGetInput +{ + public VengineAppService(IDataAccess da) : base(da) + { + } +} +public class VengineAppService : + VengineAppService + where TEntity : Entity +{ + public VengineAppService(IDataAccess da) : base(da) + { + } +} + +#endregion diff --git a/visualdev/Tnb.Vengine/AppService/VmodelAppService.cs b/visualdev/Tnb.Vengine/AppService/VmodelAppService.cs index d4e2b56a..92cf907e 100644 --- a/visualdev/Tnb.Vengine/AppService/VmodelAppService.cs +++ b/visualdev/Tnb.Vengine/AppService/VmodelAppService.cs @@ -4,6 +4,7 @@ ///////////////////////////////////////////////////////////////////////////////// using JNPF; +using JNPF.Common.Manager; using JNPF.Common.Security; using JNPF.ViewEngine; using Mapster; @@ -23,13 +24,15 @@ namespace Tnb.Vengine.AppService; public class VmodelAppService : VengineAppService, IVmodelAppService { private readonly IViewEngine _viewEngine; + private readonly ICacheManager _cache; /// /// 构造函数 /// - public VmodelAppService(IDataAccess da, IViewEngine viewEngine) : base(da) + public VmodelAppService(IDataAccess da, IViewEngine viewEngine, ICacheManager cache) : base(da) { _viewEngine = viewEngine; + _cache = cache; } /// @@ -59,21 +62,19 @@ public class VmodelAppService : VengineAppService, IVmodelAppService /// /// 获取多条 数据列表 /// - public override async Task GetListAsync(VmGetListInput input) + public override async Task> GetListAsync(VmGetListInput input) + { + return await ListAsync(input.ToQueryInput()); + } + + [NonAction] + public override async Task> ListAsync(VmQueryInput input) { VmPagedOutput ret = new(); var q = _db.Queryable().WhereIF(!string.IsNullOrEmpty(input.k), a => a.vmCode.Contains(input.k!) || a.vmName.Contains(input.k!)); RefAsync total = 0; var data = await q.OrderBy(input.sort).ToPageListAsync((input.pnum - 1) * input.psize, input.psize, total); - ret.total = total; - ret.items = data.Adapt>(); - return ret; - } - - [NonAction] - public override Task ListAsync(VmQueryInput input) - { - return base.ListAsync(input); + return PagedOutput.Create(total, data.Adapt>()); } /// @@ -102,6 +103,7 @@ public class VmodelAppService : VengineAppService, IVmodelAppService vm.vmCode = vm.vmCode.ToKebab(); vm.navProps.ForEach(a => a.naviModel = null); await _db.Updateable(vm).WhereColumns(a => a.id).ExecuteCommandAsync(); + await _cache.DelAsync(_dataAccess.GetVmodelCacheKey(vm.id)); return input; } @@ -111,6 +113,7 @@ public class VmodelAppService : VengineAppService, IVmodelAppService public override async Task DeleteAsync(VmDeleteInput input) { var ret = await _db.Deleteable(input.id).ExecuteCommandAsync(); + await _cache.DelAsync(_dataAccess.GetVmodelCacheKey(input.id!)); return ret; } diff --git a/visualdev/Tnb.Vengine/AppService/VmodelPageAppService.cs b/visualdev/Tnb.Vengine/AppService/VmodelPageAppService.cs index 6bd20bf2..b086377e 100644 --- a/visualdev/Tnb.Vengine/AppService/VmodelPageAppService.cs +++ b/visualdev/Tnb.Vengine/AppService/VmodelPageAppService.cs @@ -42,15 +42,13 @@ public class VmodelPageAppService : VengineAppService, IVmodelPageAp /// /// 获取多条 数据列表 /// - public override async Task GetListAsync(VmGetListInput input) + public override async Task> ListAsync(VmQueryInput input) { VmPagedOutput ret = new(); var q = _db.Queryable().WhereIF(!string.IsNullOrEmpty(input.k), a => a.code.Contains(input.k!) || a.name.Contains(input.k!)); RefAsync total = 0; var data = await q.OrderBy(input.sort).ToPageListAsync((input.pnum - 1) * input.psize, input.psize, total); - ret.total = total; - ret.items = data.Adapt>(); - return ret; + return PagedOutput.Create(total, data.Adapt>()); } /// diff --git a/visualdev/Tnb.Vengine/DataAccess/DataAccess.cs b/visualdev/Tnb.Vengine/DataAccess/DataAccess.cs index 41123296..d5f24ce5 100644 --- a/visualdev/Tnb.Vengine/DataAccess/DataAccess.cs +++ b/visualdev/Tnb.Vengine/DataAccess/DataAccess.cs @@ -101,6 +101,14 @@ public class DataAccess : IDataAccess, ITransient, IDisposable return model; } + /// + /// 获取 Vmodel 的缓存键 + /// + public string GetVmodelCacheKey(string id) + { + return $"tnb.vmodel:{id}"; + } + /// /// 获取 Vmodel, 为空时不抛异常 /// @@ -119,7 +127,7 @@ public class DataAccess : IDataAccess, ITransient, IDisposable /// public async Task GetVmodelAsync(string id, bool loadNavigate = false) { - var key = $"tnb.vmodel:{id}"; + var key = GetVmodelCacheKey(id); var vm = await _cache.GetAsync(key); if (vm == null) { diff --git a/visualdev/Tnb.Vengine/DataAccess/IDataAccess.cs b/visualdev/Tnb.Vengine/DataAccess/IDataAccess.cs index f6230d52..09576702 100644 --- a/visualdev/Tnb.Vengine/DataAccess/IDataAccess.cs +++ b/visualdev/Tnb.Vengine/DataAccess/IDataAccess.cs @@ -28,6 +28,11 @@ public interface IDataAccess : ITransient /// Task TryGetVmodelAsync(string id, bool loadNavigate = false); + /// + /// 获取 Vmodel 的缓存键 + /// + string GetVmodelCacheKey(string id); + /// /// 获取 Vmodel, 为空时抛异常 /// diff --git a/visualdev/Tnb.Vengine/Domain/VengineDto.cs b/visualdev/Tnb.Vengine/Domain/VengineDto.cs index 9ea1a0aa..1596a454 100644 --- a/visualdev/Tnb.Vengine/Domain/VengineDto.cs +++ b/visualdev/Tnb.Vengine/Domain/VengineDto.cs @@ -11,10 +11,10 @@ namespace Tnb.Vengine.Domain; public class VmBaseInput { - ///// - ///// 视图模型id - ///// - //public string vmid { get; set; } = string.Empty; + /// + /// 附加参数 + /// + public object? extra { get; set; } } public class VmGetInput : VmBaseInput @@ -33,6 +33,23 @@ public class VmGetInput : VmBaseInput /// 输出字段 /// public string o { get; set; } = "*"; + + /// + /// 转换为QueryInput + /// + /// + /// + public VmQueryInput ToQueryInput(string primaryKey) + { + VmQueryInput arg = this.Adapt(); + if (!string.IsNullOrEmpty(id)) + { + if (arg.q == null) arg.q = new DObject(); + arg.q.Add(primaryKey, id); + } + + return arg; + } } public class VmGetListInput : VmBaseInput @@ -67,7 +84,11 @@ public class VmGetListInput : VmBaseInput /// public string o { get; set; } = "*"; - public VmQueryInput ToListInput() + /// + /// 转换为QueryInput + /// + /// + public VmQueryInput ToQueryInput() { VmQueryInput arg = this.Adapt(); @@ -89,11 +110,6 @@ public class VmQueryInput : VmGetListInput /// 查询条件 /// public new DObject? q { get; set; } - - /// - /// 高级查询 - /// - public DObject? adv { get; set; } } /// @@ -139,14 +155,32 @@ public class VmDeleteInput : VmBaseInput public List? ids { get; set; } } +public class PagedOutput +{ + public int total { get; set; } + public object? extra { get; set; } + public static PagedOutput Create(int totalNum, List ls) + { + return new PagedOutput(totalNum, ls); + } +} + /// /// 分页列表输出对象 /// /// -public class PagedOutput +public class PagedOutput : PagedOutput { - public int total { get; set; } public List items { get; set; } = new List(); + + public PagedOutput() + { + } + public PagedOutput(int totalNum, List ls) + { + total = totalNum; + items = ls; + } } /// @@ -154,18 +188,12 @@ public class PagedOutput /// public class VmPagedOutput : PagedOutput { + public PagedOutput ToPagedOutput() + { + return new PagedOutput() + { + total = total, + items = items.Adapt>() + }; + } } - -///// -///// 查询属性信息 -///// -//public class VmSelectProp -//{ -// public const string MAIN_ALIES = "m"; -// public string code { get; set; } = string.Empty; -// public string field { get; set; } = string.Empty; -// public List navPath { get; set; } = new List(); -// public string navCode { get; set; } = MAIN_ALIES; -// public ePropType propType { get; set; } -// public eNavigateType navType { get; set; } -//} \ No newline at end of file diff --git a/visualdev/Tnb.Vengine/Domain/VmQueryParser.cs b/visualdev/Tnb.Vengine/Domain/VmQueryParser.cs index 27439be0..8f12616c 100644 --- a/visualdev/Tnb.Vengine/Domain/VmQueryParser.cs +++ b/visualdev/Tnb.Vengine/Domain/VmQueryParser.cs @@ -56,9 +56,9 @@ internal class VmQueryParser { // t1.t2.id List outputs = output.Split(',').Distinct().ToList(); - foreach (string? outStr in outputs) + foreach (string? s in outputs) { - _ = ClearStr(outStr); + var outStr = ClearStr(s); if (string.IsNullOrWhiteSpace(outStr)) { continue; @@ -126,15 +126,15 @@ internal class VmQueryParser } string[] orders = sort.Split(','); - foreach (string orderStr in orders) + foreach (string s in orders) { - _ = ClearStr(orderStr); + var orderStr = ClearStr(s); if (string.IsNullOrWhiteSpace(orderStr)) { continue; } // 拆分 m.code desc - string[] codes = orderStr.Split(' ', 1); + string[] codes = orderStr.Split(' ', 2); // 拆分 m.code (string?, string) orderPath = codes[0].GetParent(NAVI_SEPERATE); orderPath.Item1 ??= MAIN_ALIES; diff --git a/visualdev/Tnb.Vengine/Domain/Vmodel.cs b/visualdev/Tnb.Vengine/Domain/Vmodel.cs index fbc255fe..18c3384e 100644 --- a/visualdev/Tnb.Vengine/Domain/Vmodel.cs +++ b/visualdev/Tnb.Vengine/Domain/Vmodel.cs @@ -7,10 +7,10 @@ using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Reflection; +using JNPF.Common.Contracts; using JNPF.Common.Core.Manager; using JNPF.Common.Extension; using Mapster; -using Newtonsoft.Json.Linq; using SqlSugar; using Tnb.Core; using Yitter.IdGenerator; @@ -65,19 +65,19 @@ public partial class Vmodel : Entity /// 表字段属性 /// [SugarColumn(ColumnName = "db_props", IsNullable = false, IsJson = true)] - public List dbProps { get; set; } = new List(); + public List dbProps { get; set; } = []; /// /// 导航属性 /// [SugarColumn(ColumnName = "nav_props", IsNullable = true, IsJson = true)] - public List navProps { get; set; } = new List(); + public List navProps { get; set; } = []; /// /// 计算属性 /// [SugarColumn(ColumnName = "cal_props", IsNullable = true, IsJson = true)] - public List calProps { get; set; } = new List(); + public List calProps { get; set; } = []; /// /// 排序 @@ -134,8 +134,7 @@ public partial class Vmodel : Entity public string? modifyId { get; set; } [SugarColumn(IsIgnore = true)] - public string fullCode - { get { return areaCode + "/" + vmCode; } } + public string fullCode => areaCode + "/" + vmCode; /// /// 主键 @@ -157,7 +156,7 @@ public partial class Vmodel : Entity public static Vmodel CreateByEntity(Type tpEntity, string? dbCode = null) { Vmodel model = new() { dbCode = dbCode, vmCode = tpEntity.Name }; - var sugarTableAttr = tpEntity.GetCustomAttribute(); + SugarTable? sugarTableAttr = tpEntity.GetCustomAttribute(); if (sugarTableAttr != null) { model.tableName = sugarTableAttr.TableName; @@ -171,12 +170,12 @@ public partial class Vmodel : Entity { model.vmName = tpEntity.GetCustomAttribute()?.Name ?? tpEntity.GetCustomAttribute()?.Description ?? model.vmCode; } - var props = tpEntity.GetProperties(BindingFlags.Public); + PropertyInfo[] props = tpEntity.GetProperties(BindingFlags.Public); int n = 1; - foreach (var p in props) + foreach (PropertyInfo p in props) { VmDbProp prop = new(); - var sugarColumn = p.GetCustomAttribute(); + SugarColumn? sugarColumn = p.GetCustomAttribute(); if (sugarColumn != null) { prop = sugarColumn.Adapt(); @@ -204,10 +203,7 @@ public partial class Vmodel : Entity /// public string? PropToFieldCode(string propCode) { - if(_mapProps == null) - { - _mapProps = dbProps.ToDictionary(a=>a.code); - } + _mapProps ??= dbProps.ToDictionary(a => a.code); return _mapProps.GetOrDefault(propCode)?.field; } @@ -219,10 +215,7 @@ public partial class Vmodel : Entity /// public VmDbProp? GetDbProp(string propCode) { - if (_mapProps == null) - { - _mapProps = dbProps.ToDictionary(a => a.code); - } + _mapProps ??= dbProps.ToDictionary(a => a.code); return _mapProps.GetOrDefault(propCode); } @@ -232,8 +225,8 @@ public partial class Vmodel : Entity /// public DObject GetDefaultDObject() { - DObject obj = new(); - foreach (var p in dbProps) + DObject obj = []; + foreach (VmDbProp p in dbProps) { obj.Add(p.code, p.GetDefaultValue()!); } @@ -246,8 +239,8 @@ public partial class Vmodel : Entity /// public DObject ToCreateEntity(DObject input, IUserManager user) { - DObject obj = new(); - foreach (var p in dbProps) + DObject obj = []; + foreach (VmDbProp p in dbProps) { if (input.ContainsKey(p.code)) { @@ -280,8 +273,8 @@ public partial class Vmodel : Entity /// public DObject ToUpdateEntity(DObject input, IUserManager user) { - DObject obj = new(); - foreach (var p in dbProps) + DObject obj = []; + foreach (VmDbProp p in dbProps) { if (input.ContainsKey(p.code)) { diff --git a/visualdev/Tnb.Vengine/Domain/VmodelLink.cs b/visualdev/Tnb.Vengine/Domain/VmodelLink.cs index 412dd647..ce51cf3e 100644 --- a/visualdev/Tnb.Vengine/Domain/VmodelLink.cs +++ b/visualdev/Tnb.Vengine/Domain/VmodelLink.cs @@ -3,6 +3,7 @@ // https://git.tuotong-tech.com/tnb/tnb.server // ///////////////////////////////////////////////////////////////////////////////// +using JNPF.Common.Contracts; using SqlSugar; using Yitter.IdGenerator; diff --git a/visualdev/Tnb.Vengine/Domain/VmodelPage.cs b/visualdev/Tnb.Vengine/Domain/VmodelPage.cs index 724f09f5..e2354eae 100644 --- a/visualdev/Tnb.Vengine/Domain/VmodelPage.cs +++ b/visualdev/Tnb.Vengine/Domain/VmodelPage.cs @@ -3,6 +3,7 @@ // https://git.tuotong-tech.com/tnb/tnb.server // ///////////////////////////////////////////////////////////////////////////////// +using JNPF.Common.Contracts; using Newtonsoft.Json.Linq; using SqlSugar; using Yitter.IdGenerator;