diff --git a/apihost/Tnb.API.Entry/Extensions/ConfigureMvcControllerExtensions.cs b/apihost/Tnb.API.Entry/Extensions/ConfigureMvcControllerExtensions.cs
index a3f102db..38ac8e17 100644
--- a/apihost/Tnb.API.Entry/Extensions/ConfigureMvcControllerExtensions.cs
+++ b/apihost/Tnb.API.Entry/Extensions/ConfigureMvcControllerExtensions.cs
@@ -3,10 +3,12 @@ using JNPF.API.Entry.Handlers;
using JNPF.Common.Core.Filter;
using JNPF.JsonSerialization;
using JNPF.UnifyResult;
+using Mapster;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.HttpOverrides;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
+using Tnb.Vengine;
namespace Microsoft.Extensions.DependencyInjection;
@@ -22,6 +24,7 @@ public static class ConfigureMvcControllerExtensions
///
public static IServiceCollection ConfigureMvcController(this IServiceCollection services)
{
+ AdapterCfg.ConfigGlobal();
services.AddControllers()
.AddMvcFilter()
.AddInjectWithUnifyResult()
diff --git a/common/Tnb.Common/Models/DObject.cs b/common/Tnb.Common/Models/DObject.cs
index 855353d2..eea73a8a 100644
--- a/common/Tnb.Common/Models/DObject.cs
+++ b/common/Tnb.Common/Models/DObject.cs
@@ -47,4 +47,8 @@ public class DObject : Dictionary
}
}
+ public static DObject? FromObject(object? data)
+ {
+ return data?.Adapt(AdapterCfg.ExactCase);
+ }
}
diff --git a/visualdev/Tnb.Vengine/Mapper/TypeAdapter.cs b/common/Tnb.Common/Utils/AdapterCfg.cs
similarity index 68%
rename from visualdev/Tnb.Vengine/Mapper/TypeAdapter.cs
rename to common/Tnb.Common/Utils/AdapterCfg.cs
index 46948d2e..3fe5d46e 100644
--- a/visualdev/Tnb.Vengine/Mapper/TypeAdapter.cs
+++ b/common/Tnb.Common/Utils/AdapterCfg.cs
@@ -3,22 +3,29 @@
// https://git.tuotong-tech.com/tnb/tnb.server //
/////////////////////////////////////////////////////////////////////////////////
-using Mapster;
using Newtonsoft.Json.Linq;
-namespace Tnb.Vengine;
+namespace Mapster;
-public class TypeAdapter
+public class AdapterCfg
{
- public static TypeAdapterConfig IgnoreNull { get; }
+ public static TypeAdapterConfig IgnoreNull { get; internal set; }
+ public static TypeAdapterConfig ExactCase { get; internal set; }
- static TypeAdapter()
+ static AdapterCfg()
+ {
+ IgnoreNull = TypeAdapterConfig.GlobalSettings.Clone();
+ IgnoreNull.Default.IgnoreNullValues(true);
+
+ ExactCase = TypeAdapterConfig.GlobalSettings.Clone();
+ ExactCase.Default.NameMatchingStrategy(NameMatchingStrategy.Exact);
+ }
+
+ public static void ConfigGlobal()
{
TypeAdapterConfig.GlobalSettings.Default.PreserveReference(true);
TypeAdapterConfig.GlobalSettings.NewConfig().MapWith(json => json);
TypeAdapterConfig.GlobalSettings.NewConfig().MapWith(json => json);
TypeAdapterConfig.GlobalSettings.NewConfig().MapWith(json => json);
- IgnoreNull = TypeAdapterConfig.GlobalSettings.Clone();
- IgnoreNull.Default.IgnoreNullValues(true);
}
}
\ No newline at end of file
diff --git a/visualdev/Tnb.Vengine/AppService/BaseAppService.cs b/visualdev/Tnb.Vengine/AppService/BaseAppService.cs
index 48475349..891cb27c 100644
--- a/visualdev/Tnb.Vengine/AppService/BaseAppService.cs
+++ b/visualdev/Tnb.Vengine/AppService/BaseAppService.cs
@@ -5,6 +5,8 @@
using JNPF.DependencyInjection;
using JNPF.DynamicApiController;
+using Tnb.Vengine.DataAccess;
+using Tnb.Vengine.Domain;
namespace Tnb.Vengine.AppService;
@@ -13,6 +15,37 @@ namespace Tnb.Vengine.AppService;
///
public class BaseAppService : IDynamicApiController, ITransient
{
+ protected readonly IDataAccess _dataAccess;
+ private readonly Dictionary _models = new();
+
+ public BaseAppService(IDataAccess dataAccess)
+ {
+ _dataAccess = dataAccess;
+ }
+
+ ///
+ /// 根据id获取Vmodel
+ ///
+ protected async Task GetVmodelAsync(string id)
+ {
+ if (!_models.ContainsKey(id))
+ {
+ _models[id] = await _dataAccess.GetVmodelAsync(id, false);
+ }
+ return _models[id];
+ }
+ ///
+ /// 根据areaCode和vmCode获取Vmodel
+ ///
+ protected async Task GetVmodelAsync(string areaCode, string vmCode)
+ {
+ var key = areaCode + "/" + vmCode;
+ if (!_models.ContainsKey(key))
+ {
+ _models[key] = await _dataAccess.GetVmodelAsync(areaCode, vmCode, false);
+ }
+ return _models[key];
+ }
}
//[ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 100)]
diff --git a/visualdev/Tnb.Vengine/AppService/VengineAppService.cs b/visualdev/Tnb.Vengine/AppService/VengineAppService.cs
index 266eccc1..49ee50fb 100644
--- a/visualdev/Tnb.Vengine/AppService/VengineAppService.cs
+++ b/visualdev/Tnb.Vengine/AppService/VengineAppService.cs
@@ -22,32 +22,17 @@ namespace Tnb.Vengine.AppService;
[Route("/")]
public class VengineAppService : BaseAppService, IVengineAppService
{
- private readonly IDataAccess _dataAccess;
- private readonly ISqlSugarClient _db;
- private readonly Dictionary _models = new();
+ //private readonly ISqlSugarClient _db;
///
/// 构造函数
///
- public VengineAppService(IDataAccess da)
+ public VengineAppService(IDataAccess da):base(da)
{
- _dataAccess = da;
- _db = _dataAccess.GetSqlSugar();
+ //_db = _dataAccess.GetSqlSugar();
}
#region 按模型的id进行增删改查接口
- ///
- /// 获取Vmodel
- ///
- private async Task GetVmodelAsync(string id)
- {
- if (!_models.ContainsKey(id))
- {
- _models[id] = await _dataAccess.GetVmodelAsync(id, false);
- }
- return _models[id];
- }
-
///
/// 获取一条 数据信息
///
@@ -55,7 +40,9 @@ public class VengineAppService : BaseAppService, IVengineAppService
public async Task GetAsync(string vmid, [FromQuery] VmGetInput input)
{
var vm = await GetVmodelAsync(vmid);
- var arg = input.ToQueryInput(vm.GetPrimary().code);
+ var arg = input.Adapt();
+ arg.AddQueryParaIf(!string.IsNullOrEmpty(input.id), vm.GetPrimary().code, input.id!);
+
var ls = await ListAsync(vmid, arg);
return ls.items.FirstOrDefault();
}
@@ -116,17 +103,6 @@ public class VengineAppService : BaseAppService, IVengineAppService
#endregion 按模型的id进行增删改查接口
#region 按模型的areaCode和vmcode进行增删改查接口
-
- private async Task GetVmodelAsync(string areaCode, string vmCode)
- {
- var key = areaCode + "/" + vmCode;
- if (!_models.ContainsKey(key))
- {
- _models[key] = await _dataAccess.GetVmodelAsync(areaCode, vmCode, false);
- }
- return _models[key];
- }
-
///
/// 获取一条 数据信息
///
@@ -134,7 +110,9 @@ public class VengineAppService : BaseAppService, IVengineAppService
public async Task GetAsync(string areaCode, string vmCode, [FromQuery] VmGetInput input)
{
var vm = await GetVmodelAsync(areaCode, vmCode);
- var arg = input.ToQueryInput(vm.GetPrimary().code);
+ var arg = input.Adapt();
+ arg.AddQueryParaIf(!string.IsNullOrEmpty(input.id), vm.GetPrimary().code, input.id!);
+
var ls = await ListAsync(areaCode, vmCode, arg);
return ls.items.FirstOrDefault();
}
diff --git a/visualdev/Tnb.Vengine/AppService/VengineAppServiceT.cs b/visualdev/Tnb.Vengine/AppService/VengineAppServiceT.cs
index 0ea7d967..f5975d96 100644
--- a/visualdev/Tnb.Vengine/AppService/VengineAppServiceT.cs
+++ b/visualdev/Tnb.Vengine/AppService/VengineAppServiceT.cs
@@ -6,10 +6,14 @@
using System.Reflection;
using System.Security.Cryptography;
using Aop.Api.Domain;
+using JNPF;
using JNPF.Common.Contracts;
+using JNPF.Common.Extension;
using Mapster;
using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Controllers;
using SqlSugar;
using Tnb.Core;
using Tnb.Vengine.DataAccess;
@@ -31,57 +35,55 @@ public class VengineAppService _models = new();
///
/// 构造函数
///
- public VengineAppService(IDataAccess dataAccess)
+ public VengineAppService(IDataAccess dataAccess) : base(dataAccess)
{
- _dataAccess = dataAccess;
- _db = _dataAccess.GetSqlSugar();
+ _db = dataAccess.GetSqlSugar();
}
protected virtual async Task GetVmodelAsync()
{
+ string? areaCode = null, vmCode = null;
+ // 1.优先从路由中获取模型code
+ IHttpContextAccessor httpContextAccessor = App.GetService();
+ var routes = httpContextAccessor.HttpContext?.Request.RouteValues;
+ //HttpContext.GetEndpoint()?.Metadata.GetMetadata();
+ if (routes != null)
+ {
+ areaCode = routes.GetOrDefault("area")?.ToString();
+ vmCode = routes.GetOrDefault("controller")?.ToString();
+ if (!string.IsNullOrEmpty(areaCode) && !string.IsNullOrEmpty(vmCode))
+ {
+ return await GetVmodelAsync(areaCode, vmCode);
+ }
+ }
+ // 2.其次从实体特性中获取模型code
var tp = typeof(TEntity);
- 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(vset.Id))
+ {
+ return await GetVmodelAsync(vset.Id);
+ }
+ areaCode = vset.Area;
+ vmCode = vset.Code;
}
- if (!string.IsNullOrEmpty(id))
+ // 3.从实体命名空间中获取模型code
+ if (string.IsNullOrEmpty(areaCode))
{
- if (!_models.ContainsKey(id))
- {
- _models[id] = await _dataAccess.GetVmodelAsync(id, false);
- //_models[_models[id].fullCode] = _models[id];
- }
- return _models[id];
+ ThrowIf.IsNullOrEmpty(tp.Namespace, $"类型 {nameof(tp)} 的命名空间不可为空");
+ areaCode = tp.Namespace.RemovePreFix(ModuleConst.NsPrefix + ".").Replace(".Domain", "").Replace(".Entities", "").ToKebab();
}
- else
+ if (string.IsNullOrEmpty(vmCode))
{
- 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];
+ vmCode = tp.Name.ToKebab();
}
+ return await GetVmodelAsync(areaCode, vmCode);
}
///
@@ -92,11 +94,7 @@ public class VengineAppService();
- if (input.id != null)
- {
- if (arg.q == null) arg.q = new DObject();
- arg.q.Add(vm.GetPrimary().code, input.id);
- }
+ arg.AddQueryParaIf(!string.IsNullOrEmpty(input.id), vm.GetPrimary().code, input.id!);
var data = (await ListAsync(arg)).items.FirstOrDefault();
return data == null ? default! : data.Adapt();
@@ -129,7 +127,7 @@ public class VengineAppService CreateAsync([FromBody] TCreateInput input)
{
var vm = await GetVmodelAsync();
- var ret = await _dataAccess.CreateDataAsync(vm, input);
+ var ret = await _dataAccess.CreateDataAsync(vm, input.ToEditInput());
return ret;
}
@@ -140,7 +138,7 @@ public class VengineAppService UpdateAsync([FromBody] TUpdateInput input)
{
var vm = await GetVmodelAsync();
- var ret = await _dataAccess.UpdateDataAsync(vm, input);
+ var ret = await _dataAccess.UpdateDataAsync(vm, input.ToEditInput());
return ret;
}
diff --git a/visualdev/Tnb.Vengine/AppService/VmodelAppService.cs b/visualdev/Tnb.Vengine/AppService/VmodelAppService.cs
index 751388db..b03f2231 100644
--- a/visualdev/Tnb.Vengine/AppService/VmodelAppService.cs
+++ b/visualdev/Tnb.Vengine/AppService/VmodelAppService.cs
@@ -4,6 +4,7 @@
/////////////////////////////////////////////////////////////////////////////////
using JNPF;
+using JNPF.Common.Core.Manager;
using JNPF.Common.Manager;
using JNPF.Common.Security;
using JNPF.ViewEngine;
@@ -13,26 +14,29 @@ using SqlSugar;
using Tnb.Core;
using Tnb.Vengine.DataAccess;
using Tnb.Vengine.Domain;
+using Yitter.IdGenerator;
namespace Tnb.Vengine.AppService;
///
-/// 视图模型服务类
+/// 视图模型服务类,
///
[ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, KeepVerb = true, Order = 1102)]
-[Route("api/[area]/[controller]/[action]")]
+//[Route("api/[area]/[controller]/[action]")]
public class VmodelAppService : VengineAppService, IVmodelAppService
{
private readonly IViewEngine _viewEngine;
private readonly ICacheManager _cache;
+ private readonly IUserManager _user;
///
/// 构造函数
///
- public VmodelAppService(IDataAccess da, IViewEngine viewEngine, ICacheManager cache) : base(da)
+ public VmodelAppService(IDataAccess da, IViewEngine viewEngine, ICacheManager cache, IUserManager user) : base(da)
{
_viewEngine = viewEngine;
_cache = cache;
+ _user = user;
}
///
@@ -65,7 +69,8 @@ public class VmodelAppService : VengineAppService> ListAsync(VmQueryInput input)
{
- var q = _db.Queryable().WhereIF(!string.IsNullOrEmpty(input.k), a => a.vmCode.Contains(input.k!) || a.vmName.Contains(input.k!));
+ var q = _db.Queryable().Where(a => a.deleted == 0)
+ .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);
return PagedOutput.Create(total, data);
@@ -77,10 +82,12 @@ public class VmodelAppService : VengineAppService CreateAsync(VmodelCreateInput input)
{
ThrowIf.IsNull(input.data);
- //ArgumentNullException.ThrowIfNull(input.data);
- Vmodel vm = input.data.ToObject();
+ Vmodel vm = input.data.Adapt();
+ vm.id = YitIdHelper.NextId().ToString();
vm.areaCode = vm.areaCode.ToKebab();
vm.vmCode = vm.vmCode.ToKebab();
+ vm.createTime = DateTime.Now;
+ vm.createId = _user.UserId;
await _db.Insertable(vm).ExecuteCommandAsync();
return vm;
}
@@ -91,11 +98,14 @@ public class VmodelAppService : VengineAppService UpdateAsync(VmodelUpdateInput input)
{
ThrowIf.IsNull(input.data);
- //ArgumentNullException.ThrowIfNull(input.data);
- Vmodel vm = input.data.ToObject();
+ ThrowIf.IsNullOrEmpty(input.data.id, $"更新数据时主键(id)不可为空");
+
+ Vmodel vm = input.data.Adapt();
vm.areaCode = vm.areaCode.ToKebab();
vm.vmCode = vm.vmCode.ToKebab();
vm.navProps.ForEach(a => a.naviModel = null);
+ vm.modifyTime = DateTime.Now;
+ vm.modifyId = _user.UserId;
await _db.Updateable(vm).WhereColumns(a => a.id).ExecuteCommandAsync();
await _cache.DelAsync(_dataAccess.GetVmodelCacheKey(vm.id));
return vm;
@@ -106,7 +116,7 @@ public class VmodelAppService : VengineAppService
public override async Task DeleteAsync(VmDeleteInput input)
{
- var ret = await _db.Deleteable(input.id).ExecuteCommandAsync();
+ var ret = await _db.Updateable().SetColumns(a => a.deleted, 1).Where(a => a.id == input.id).ExecuteCommandAsync();
await _cache.DelAsync(_dataAccess.GetVmodelCacheKey(input.id!));
return ret;
}
diff --git a/visualdev/Tnb.Vengine/AppService/VmodelDto.cs b/visualdev/Tnb.Vengine/AppService/VmodelDto.cs
index 2cbbb864..d935a9aa 100644
--- a/visualdev/Tnb.Vengine/AppService/VmodelDto.cs
+++ b/visualdev/Tnb.Vengine/AppService/VmodelDto.cs
@@ -3,10 +3,18 @@
// https://git.tuotong-tech.com/tnb/tnb.server //
/////////////////////////////////////////////////////////////////////////////////
+using Mapster;
+using Newtonsoft.Json;
+using SqlSugar;
+using Tnb.Core;
using Tnb.Vengine.Domain;
namespace Tnb.Vengine.AppService;
+public record VmodelCreateData(string areaCode, string vmCode, string vmName, string? dbCode, string tableName, List dbProps, List navProps, List calProps, int ordinal, short softDelete, short enabled, string? descrip);
+public record VmNavPropCreateData(string code, string name, string vmid, eNavigateType navType, string refCode, string refProp, string fkProp);
+public record VmodelUpdateData(string id, string areaCode, string vmCode, string vmName, string? dbCode, string tableName, List dbProps, List navProps, List calProps, int ordinal, short softDelete, short enabled, string? descrip);
+
public class VmodelGetInput : VmGetInput
{
///
@@ -24,11 +32,17 @@ public class VmodelGetInput : VmGetInput
}
public class VmodelCreateInput : VmEditInput
{
- public new Vmodel? data { get; set; }
+ public new VmodelCreateData? data { get; set; }
+ public override VmEditInput ToEditInput()
+ {
+ VmEditInput input = this;
+ input.data = DObject.FromObject(data);
+ return input;
+ }
}
public class VmodelUpdateInput : VmEditInput
{
- public new Vmodel? data { get; set; }
+ public new VmodelUpdateData? data { get; set; }
}
public class VmodelCreateFromTableInput
{
@@ -43,11 +57,23 @@ public class VmodelCreateFromTableInput
public class VmodelPageCreateInput : VmEditInput
{
public new VmodelPage? data { get; set; }
+ public override VmEditInput ToEditInput()
+ {
+ VmEditInput input = this;
+ input.data = DObject.FromObject(data);
+ return input;
+ }
}
public class VmodelPageUpdateInput : VmEditInput
{
public new VmodelPage? data { get; set; }
+ public override VmEditInput ToEditInput()
+ {
+ VmEditInput input = this;
+ input.data = DObject.FromObject(data);
+ return input;
+ }
}
public class VmodelPageCreateFromVmodelInput
diff --git a/visualdev/Tnb.Vengine/AppService/VmodelPageAppService.cs b/visualdev/Tnb.Vengine/AppService/VmodelPageAppService.cs
index 08467778..75b29763 100644
--- a/visualdev/Tnb.Vengine/AppService/VmodelPageAppService.cs
+++ b/visualdev/Tnb.Vengine/AppService/VmodelPageAppService.cs
@@ -19,7 +19,6 @@ namespace Tnb.Vengine.AppService;
/// 视图模型服务类
///
[ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 1104, KeepVerb = true)]
-[Route("api/[area]/[controller]/[action]")]
public class VmodelPageAppService : VengineAppService, IVmodelPageAppService
{
///
@@ -29,35 +28,6 @@ public class VmodelPageAppService : VengineAppService
- ///// 新增 模型
- /////
- //public override async Task CreateAsync(VmCreateInput input)
- //{
- // ThrowIf.IsNull(input.data);
- // VmodelPage vpage = input.data.Adapt();
- // await _db.Insertable(vpage).ExecuteCommandAsync();
- // return vpage;
- //}
-
- /////
- ///// 更新 数据
- /////
- //public override async Task UpdateAsync(VmUpdateInput input)
- //{
- // ThrowIf.IsNull(input.data);
- // if (!input.data.ContainsKey(nameof(VmodelPage.id)))
- // {
- // throw new Exception($"更新数据时主键({nameof(VmodelPage.id)})不可为空");
- // }
- // var id = input.data[nameof(VmodelPage.id)].ToString();
- // var model = await _db.Queryable().FirstAsync(a => a.id == id);
- // ThrowIf.IsNull(model, $"找不到id={id}的视图页面数据");
- // input.data.Adapt(model, TypeAdapter.IgnoreNull);
- // await _db.Updateable(model).WhereColumns(a => a.id).ExecuteCommandAsync();
- // return model;
- //}
-
///
/// 从数据表创建模型
///
diff --git a/visualdev/Tnb.Vengine/DataAccess/DataAccess.cs b/visualdev/Tnb.Vengine/DataAccess/DataAccess.cs
index 0f2b9a03..d399017e 100644
--- a/visualdev/Tnb.Vengine/DataAccess/DataAccess.cs
+++ b/visualdev/Tnb.Vengine/DataAccess/DataAccess.cs
@@ -394,14 +394,7 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
if (input.data != null)
{
DObject model = vm.ToUpdateEntity(input.data, _user);
- if (!model.ContainsKey(pk.field))
- {
- throw new Exception($"更新数据时主键({pk.code})不可为空");
- }
- //if (!model.ContainsKey(pk.field) && input.id != null)
- //{
- // model.Add(pk.field, input.id);
- //}
+ ThrowIf.When(!model.ContainsKey(pk.field), $"更新数据时主键({pk.code})不可为空");
num = await db.Updateable(model).AS(vm.tableName).WhereColumns(pk.field).ExecuteCommandAsync();
}
//批量修改数据
diff --git a/visualdev/Tnb.Vengine/Domain/VengineDto.cs b/visualdev/Tnb.Vengine/Domain/VengineDto.cs
index 4e822155..f71b4923 100644
--- a/visualdev/Tnb.Vengine/Domain/VengineDto.cs
+++ b/visualdev/Tnb.Vengine/Domain/VengineDto.cs
@@ -34,22 +34,6 @@ 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
@@ -94,6 +78,27 @@ public class VmQueryInput : VmGetListInput
/// 查询条件
///
public new DObject? q { get; set; }
+
+ ///
+ /// 添加一个查询条件
+ ///
+ ///
+ ///
+ public void AddQueryPara(string key, object value)
+ {
+ if (q == null) q = new DObject();
+ q.Add(key, value);
+ }
+
+ ///
+ /// 添加一个查询条件
+ ///
+ ///
+ ///
+ public void AddQueryParaIf(bool condition, string key, object value)
+ {
+ if(condition) AddQueryPara(key, value);
+ }
}
///
@@ -110,6 +115,11 @@ public class VmEditInput : VmBaseInput
/// 批量添加
///
public List? items { get; set; }
+
+ public virtual VmEditInput ToEditInput()
+ {
+ return this;
+ }
}
///
diff --git a/visualdev/Tnb.Vengine/Domain/Vmodel.cs b/visualdev/Tnb.Vengine/Domain/Vmodel.cs
index 27e72305..2a7bcb78 100644
--- a/visualdev/Tnb.Vengine/Domain/Vmodel.cs
+++ b/visualdev/Tnb.Vengine/Domain/Vmodel.cs
@@ -23,7 +23,7 @@ namespace Tnb.Vengine.Domain;
[SugarTable("sys_vmodel")]
public partial class Vmodel : Entity
{
- public string[] SOFT_DELETED = new string[] { "deleted", "isDeleted", "softDeleted" };
+ private static string[] SOFT_DELETED = new string[] { "deleted", "isDeleted", "softDeleted" };
#region Properties
@@ -88,7 +88,7 @@ public partial class Vmodel : Entity
public int ordinal { get; set; }
///
- /// 软删除
+ /// 是否软删除
///
[SugarColumn(ColumnName = "soft_delete", IsNullable = false)]
public short softDelete { get; set; }
@@ -103,7 +103,7 @@ public partial class Vmodel : Entity
/// 是否删除
///
[SugarColumn(ColumnName = "deleted", IsNullable = false)]
- public short deleted { get; set; }
+ public short deleted { get; set; } = 0;
///
/// 描述