代码优化

master
xiaochanghai 1 year ago
parent 3c35d1c7bf
commit f746667a0e
  1. 2
      Tiobon.Core.Api/Controllers/DbFirst/DbFirstController.cs
  2. 100
      Tiobon.Core.Api/Controllers/Ghra_GradeController.cs
  3. 1
      Tiobon.Core.Api/GlobalUsings.cs
  4. 360
      Tiobon.Core.Api/Tiobon.Core.Model.xml
  5. 5
      Tiobon.Core.Api/Tiobon.Core.xml
  6. 276
      Tiobon.Core.Common/Attribute/FromFilterAttribute.cs
  7. 89
      Tiobon.Core.Common/Attribute/QueryFilter.cs
  8. 56
      Tiobon.Core.Common/Extensions/ExpressionCombiner.cs
  9. 17
      Tiobon.Core.Common/Seed/FrameSeed.cs
  10. 2
      Tiobon.Core.IServices/BASE/IBaseServices.cs
  11. 12
      Tiobon.Core.IServices/IGhra_GradeServices.cs
  12. 194
      Tiobon.Core.Model/Ghra_Grade.cs
  13. 67
      Tiobon.Core.Repository/BASE/BaseRepository.cs
  14. 11
      Tiobon.Core.Repository/BASE/IBaseRepository.cs
  15. 6
      Tiobon.Core.Services/BASE/BaseServices.cs
  16. 18
      Tiobon.Core.Services/Ghra_GradeServices.cs

@ -160,7 +160,7 @@ namespace Tiobon.Core.Controllers
data.response += $"库{ConnID}-Model层生成:{FrameSeed.CreateModels(_sqlSugarClient, ConnID, isMuti, tableNames)} || ";
//data.response += $"库{ConnID}-IRepositorys层生成:{FrameSeed.CreateIRepositorys(_sqlSugarClient, ConnID, isMuti, tableNames)} || ";
data.response += $"库{ConnID}-IServices层生成:{FrameSeed.CreateIServices(_sqlSugarClient, ConnID, isMuti, tableNames)} || ";
data.response += $"库{ConnID}-Repository层生成:{FrameSeed.CreateRepository(_sqlSugarClient, ConnID, isMuti, tableNames)} || ";
//data.response += $"库{ConnID}-Repository层生成:{FrameSeed.CreateRepository(_sqlSugarClient, ConnID, isMuti, tableNames)} || ";
data.response += $"库{ConnID}-Services层生成:{FrameSeed.CreateServices(_sqlSugarClient, ConnID, isMuti, tableNames)} || ";
// 切回主库
_sqlSugarClient.ChangeDatabase(MainDb.CurrentDbConnId.ToLower());

@ -0,0 +1,100 @@
namespace Tiobon.Core.Api.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class Ghra_GradeController : ControllerBase
{
#region 初始化
/// <summary>
/// 服务器接口,因为是模板生成,所以首字母是大写的,自己可以重构下
/// </summary>
private readonly IGhra_GradeServices _ghra_GradeServices;
public Ghra_GradeController(IGhra_GradeServices Ghra_GradeServices)
{
_ghra_GradeServices = Ghra_GradeServices;
}
#endregion
#region 基础接口
#region 查询
[HttpGet]
public async Task<MessageModel<PageModel<Ghra_Grade>>> Get([FromFilter] QueryFilter filter)
{
return new MessageModel<PageModel<Ghra_Grade>>()
{
msg = "获取成功",
success = true,
response = await _ghra_GradeServices.QueryFilterPage(filter)
};
}
[HttpGet("{id}")]
public async Task<MessageModel<Ghra_Grade>> Get(string id)
{
return new MessageModel<Ghra_Grade>()
{
msg = "获取成功",
success = true,
response = await _ghra_GradeServices.QueryById(id)
};
}
#endregion
#region 新增
[HttpPost]
public async Task<MessageModel<string>> Post([FromBody] Ghra_Grade request)
{
var data = new MessageModel<string>();
var id = await _ghra_GradeServices.Add(request);
data.success = id > 0;
if (data.success)
{
data.response = id.ObjToString();
data.msg = "添加成功";
}
return data;
}
#endregion
#region 新增
[HttpPut]
public async Task<MessageModel<string>> Put([FromBody] Ghra_Grade request)
{
var data = new MessageModel<string>();
data.success = await _ghra_GradeServices.Update(request);
if (data.success)
{
data.msg = "更新成功";
data.response = request?.Id.ObjToString();
}
return data;
}
#endregion
#region 删除
[HttpDelete]
public async Task<MessageModel<string>> Delete(int id)
{
var data = new MessageModel<string>();
var model = await _ghra_GradeServices.QueryById(id);
model.IsEnable = 1;
// data.success = await _departmentServices.Update(model);
if (data.success)
{
data.msg = "删除成功";
data.response = model?.Id.ObjToString();
}
return data;
}
#endregion
#endregion
}
}

@ -15,3 +15,4 @@ global using Tiobon.Core.Model;
global using Tiobon.Core.Model.Models;
global using Tiobon.Core.Model.ViewModels;
global using Tiobon.Core.Repository.UnitOfWorks;
global using Microsoft.AspNetCore.Mvc;

@ -34,165 +34,212 @@
所有
</summary>
</member>
<member name="T:Tiobon.Core.Model.IDS4DbModels.ApplicationRole">
<member name="T:Tiobon.Core.Model.Models.Ghra_Grade">
<summary>
以下model 来自ids4项目,多库模式,为了调取ids4数据
角色表
</summary>
</member>
<member name="P:Tiobon.Core.Model.IDS4DbModels.ApplicationRole.OrderSort">
<summary>
排序
</summary>
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.Id">
<summary>
Desc:
Default:
Nullable:False
</summary>
</member>
<member name="P:Tiobon.Core.Model.IDS4DbModels.ApplicationRole.Enabled">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.GradeNo">
<summary>
是否激活
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="P:Tiobon.Core.Model.IDS4DbModels.ApplicationRole.CreateId">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.GradeName">
<summary>
创建ID
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="P:Tiobon.Core.Model.IDS4DbModels.ApplicationRole.CreateBy">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.MKey">
<summary>
创建者
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="P:Tiobon.Core.Model.IDS4DbModels.ApplicationRole.CreateTime">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.DataBelongID">
<summary>
创建时间
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="P:Tiobon.Core.Model.IDS4DbModels.ApplicationRole.ModifyId">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.RemarkSz">
<summary>
修改ID
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="P:Tiobon.Core.Model.IDS4DbModels.ApplicationRole.ModifyBy">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.SortNo">
<summary>
修改者
Desc:
Default:1
Nullable:False
</summary>
</member>
<member name="P:Tiobon.Core.Model.IDS4DbModels.ApplicationRole.ModifyTime">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.IsEnable">
<summary>
修改时间
Desc:
Default:1
Nullable:False
</summary>
</member>
<member name="T:Tiobon.Core.Model.IDS4DbModels.ApplicationUser">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.IsDefault">
<summary>
以下model 来自ids4项目,多库模式,为了调取ids4数据
用户表
Desc:
Default:1
Nullable:False
</summary>
</member>
<member name="T:Tiobon.Core.Model.Love">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.OperateLogID">
<summary>
这是爱
Desc:
Default:0
Nullable:True
</summary>
</member>
<member name="P:Tiobon.Core.Model.Love.Id">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.CreateBy">
<summary>
id
Desc:
Default:0
Nullable:False
</summary>
</member>
<member name="P:Tiobon.Core.Model.Love.Name">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.CreateTime">
<summary>
姓名
Desc:
Default:DateTime.Now
Nullable:False
</summary>
</member>
<member name="P:Tiobon.Core.Model.Love.Age">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.CreateProg">
<summary>
年龄
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="T:Tiobon.Core.Model.MessageModel`1">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.CreateIP">
<summary>
通用返回信息类
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="P:Tiobon.Core.Model.MessageModel`1.status">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.UpdateBy">
<summary>
状态码
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="P:Tiobon.Core.Model.MessageModel`1.success">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.UpdateTime">
<summary>
操作是否成功
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="P:Tiobon.Core.Model.MessageModel`1.msg">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.UpdateProg">
<summary>
返回信息
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="P:Tiobon.Core.Model.MessageModel`1.msgDev">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.UpdateIP">
<summary>
开发者信息
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="P:Tiobon.Core.Model.MessageModel`1.response">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.Reverse1">
<summary>
返回数据集合
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="M:Tiobon.Core.Model.MessageModel`1.Success(System.String)">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.Reverse2">
<summary>
返回成功
Desc:
Default:
Nullable:True
</summary>
<param name="msg">消息</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Model.MessageModel`1.Success(System.String,`0)">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.Reverse3">
<summary>
返回成功
Desc:
Default:
Nullable:True
</summary>
<param name="msg">消息</param>
<param name="response">数据</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Model.MessageModel`1.Fail(System.String)">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.Reverse4">
<summary>
返回失败
Desc:
Default:
Nullable:True
</summary>
<param name="msg">消息</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Model.MessageModel`1.Fail(System.String,`0)">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.Reverse5">
<summary>
返回失败
Desc:
Default:
Nullable:True
</summary>
<param name="msg">消息</param>
<param name="response">数据</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Model.MessageModel`1.Message(System.Boolean,System.String,`0)">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.Reverse6">
<summary>
返回消息
Desc:
Default:
Nullable:True
</summary>
<param name="success">失败/成功</param>
<param name="msg">消息</param>
<param name="response">数据</param>
<returns></returns>
</member>
<member name="P:Tiobon.Core.Model.MessageModel.status">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.Reverse7">
<summary>
状态码
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="P:Tiobon.Core.Model.MessageModel.success">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.Reverse8">
<summary>
操作是否成功
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="P:Tiobon.Core.Model.MessageModel.msg">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.Reverse9">
<summary>
返回信息
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="P:Tiobon.Core.Model.MessageModel.response">
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.ReverseI1">
<summary>
返回数据集合
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghra_Grade.ReverseI2">
<summary>
Desc:
Default:
Nullable:True
</summary>
</member>
<member name="T:Tiobon.Core.Model.Models.AccessTrendLog">
@ -1790,6 +1837,167 @@
修改时间
</summary>
</member>
<member name="T:Tiobon.Core.Model.IDS4DbModels.ApplicationRole">
<summary>
以下model 来自ids4项目,多库模式,为了调取ids4数据
角色表
</summary>
</member>
<member name="P:Tiobon.Core.Model.IDS4DbModels.ApplicationRole.OrderSort">
<summary>
排序
</summary>
</member>
<member name="P:Tiobon.Core.Model.IDS4DbModels.ApplicationRole.Enabled">
<summary>
是否激活
</summary>
</member>
<member name="P:Tiobon.Core.Model.IDS4DbModels.ApplicationRole.CreateId">
<summary>
创建ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.IDS4DbModels.ApplicationRole.CreateBy">
<summary>
创建者
</summary>
</member>
<member name="P:Tiobon.Core.Model.IDS4DbModels.ApplicationRole.CreateTime">
<summary>
创建时间
</summary>
</member>
<member name="P:Tiobon.Core.Model.IDS4DbModels.ApplicationRole.ModifyId">
<summary>
修改ID
</summary>
</member>
<member name="P:Tiobon.Core.Model.IDS4DbModels.ApplicationRole.ModifyBy">
<summary>
修改者
</summary>
</member>
<member name="P:Tiobon.Core.Model.IDS4DbModels.ApplicationRole.ModifyTime">
<summary>
修改时间
</summary>
</member>
<member name="T:Tiobon.Core.Model.IDS4DbModels.ApplicationUser">
<summary>
以下model 来自ids4项目,多库模式,为了调取ids4数据
用户表
</summary>
</member>
<member name="T:Tiobon.Core.Model.Love">
<summary>
这是爱
</summary>
</member>
<member name="P:Tiobon.Core.Model.Love.Id">
<summary>
id
</summary>
</member>
<member name="P:Tiobon.Core.Model.Love.Name">
<summary>
姓名
</summary>
</member>
<member name="P:Tiobon.Core.Model.Love.Age">
<summary>
年龄
</summary>
</member>
<member name="T:Tiobon.Core.Model.MessageModel`1">
<summary>
通用返回信息类
</summary>
</member>
<member name="P:Tiobon.Core.Model.MessageModel`1.status">
<summary>
状态码
</summary>
</member>
<member name="P:Tiobon.Core.Model.MessageModel`1.success">
<summary>
操作是否成功
</summary>
</member>
<member name="P:Tiobon.Core.Model.MessageModel`1.msg">
<summary>
返回信息
</summary>
</member>
<member name="P:Tiobon.Core.Model.MessageModel`1.msgDev">
<summary>
开发者信息
</summary>
</member>
<member name="P:Tiobon.Core.Model.MessageModel`1.response">
<summary>
返回数据集合
</summary>
</member>
<member name="M:Tiobon.Core.Model.MessageModel`1.Success(System.String)">
<summary>
返回成功
</summary>
<param name="msg">消息</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Model.MessageModel`1.Success(System.String,`0)">
<summary>
返回成功
</summary>
<param name="msg">消息</param>
<param name="response">数据</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Model.MessageModel`1.Fail(System.String)">
<summary>
返回失败
</summary>
<param name="msg">消息</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Model.MessageModel`1.Fail(System.String,`0)">
<summary>
返回失败
</summary>
<param name="msg">消息</param>
<param name="response">数据</param>
<returns></returns>
</member>
<member name="M:Tiobon.Core.Model.MessageModel`1.Message(System.Boolean,System.String,`0)">
<summary>
返回消息
</summary>
<param name="success">失败/成功</param>
<param name="msg">消息</param>
<param name="response">数据</param>
<returns></returns>
</member>
<member name="P:Tiobon.Core.Model.MessageModel.status">
<summary>
状态码
</summary>
</member>
<member name="P:Tiobon.Core.Model.MessageModel.success">
<summary>
操作是否成功
</summary>
</member>
<member name="P:Tiobon.Core.Model.MessageModel.msg">
<summary>
返回信息
</summary>
</member>
<member name="P:Tiobon.Core.Model.MessageModel.response">
<summary>
返回数据集合
</summary>
</member>
<member name="T:Tiobon.Core.Model.DepartmentRoot`1">
<summary>
部门表

@ -1216,6 +1216,11 @@
<param name="pid"></param>
<returns></returns>
</member>
<member name="F:Tiobon.Core.Api.Controllers.Ghra_GradeController._ghra_GradeServices">
<summary>
服务器接口,因为是模板生成,所以首字母是大写的,自己可以重构下
</summary>
</member>
<member name="T:Tiobon.Core.Api.Controllers.NacosController">
<summary>
服务管理

@ -0,0 +1,276 @@
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Tiobon.Core.Common
{
public class FilterHeaderBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
var name = bindingContext.FieldName;
var headers = bindingContext.HttpContext.Request.Headers;
QueryFilter queryFilter;
if (!headers.ContainsKey(name))
{
queryFilter = QueryFilter.Default;
bindingContext.Result = ModelBindingResult.Success(queryFilter);
return Task.CompletedTask;
}
string filter = headers[name];
if (bindingContext.ModelType == typeof(string))
{
bindingContext.Result = ModelBindingResult.Success(filter);
return Task.CompletedTask;
}
try
{
if (string.IsNullOrEmpty(filter) || filter == "%22%22" || filter.ToLower() == "%7b%7d")
{
queryFilter = QueryFilter.Default;
}
else if (filter.Trim() == "undefined" || filter.Trim() == "null")
{
queryFilter = QueryFilter.Default;
//LoggerHelper.SendLogError($"QueryFilter 反序列化异常: {filter}\r\n请求地址: {bindingContext.HttpContext.Request.GetEncodedUrl()}");
}
else
{
queryFilter = JsonConvert.DeserializeObject<QueryFilter>(System.Web.HttpUtility.UrlDecode(filter));
SetPredicateValues(queryFilter, bindingContext);
}
bindingContext.Result = ModelBindingResult.Success(queryFilter ?? QueryFilter.Default);
}
catch
{
//LoggerHelper.SendLogError($"QueryFilter 反序列化失败: {filter}\r\n请求地址: {bindingContext.HttpContext.Request.GetEncodedUrl()}");
bindingContext.Result = ModelBindingResult.Success(QueryFilter.Default);
}
return Task.CompletedTask;
}
/// <summary>
/// 设置 PredicateValues 的值类型
/// </summary>
/// <param name="queryFilter"></param>
/// <param name="bindingContext"></param>
private static void SetPredicateValues(QueryFilter queryFilter, ModelBindingContext bindingContext)
{
if (queryFilter?.PredicateValues == null || queryFilter.PredicateValues.Length == 0)
{
return;
}
for (int i = 0; i < queryFilter.PredicateValues.Length; i++)
{
if (queryFilter.PredicateValues[i] is JObject jObj)
{
var prop = jObj.Properties()?.FirstOrDefault();
if (prop == null)
continue;
var type = StringConvertToType(prop.Name);
if (type == null)
continue;
try
{
var v = JsonConvert.DeserializeObject(prop.Value?.ToString(), type);
if (v != null)
{
queryFilter.PredicateValues[i] = v;
}
}
catch (Exception ex)
{
//LoggerHelper.SendLogError($"QueryFilter.PredicateValues[{i}] [{queryFilter.PredicateValues[i]}] 反序列化失败\r\n" +
// $"请求地址: {bindingContext.HttpContext.Request.GetEncodedUrl()}\r\n" +
// $"错误信息: {ex}");
}
}
}
}
#region 字符串获取类型
/// <summary>
/// 根据 <paramref name="name"/> 获取 <see cref="Type"/> 类型
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static Type StringConvertToType(string name)
{
if (string.IsNullOrEmpty(name))
{
return default;
}
switch (name.Trim().ToUpper())
{
case "INT":
case "INT32":
return typeof(int);
case "INT?":
case "INT32?":
return typeof(int?);
case "INT[]":
case "INT32[]":
return typeof(int[]);
case "INT?[]":
case "INT32?[]":
return typeof(int?[]);
case "LIST<INT>":
case "LIST<INT32>":
return typeof(List<int>);
case "LIST<INT?>":
case "LIST<INT32?>":
return typeof(List<int?>);
case "LONG":
case "INT64":
return typeof(long);
case "LONG?":
case "INT64?":
return typeof(long?);
case "LONG[]":
case "INT64[]":
return typeof(long[]);
case "LONG?[]":
case "INT64?[]":
return typeof(long?[]);
case "LIST<LONG>":
case "LIST<INT64>":
return typeof(List<long>);
case "LIST<LONG?>":
case "LIST<INT64?>":
return typeof(List<long?>);
case "FLOAT":
case "SINGLE":
return typeof(float);
case "FLOAT?":
case "SINGLE?":
return typeof(float?);
case "FLOAT[]":
case "SINGLE[]":
return typeof(float[]);
case "FLOAT?[]":
case "SINGLE?[]":
return typeof(float?[]);
case "LIST<FLOAT>":
case "LIST<SINGLE>":
return typeof(List<float>);
case "LIST<FLOAT?>":
case "LIST<SINGLE?>":
return typeof(List<float?>);
case "DOUBLE":
return typeof(double);
case "DOUBLE?":
return typeof(double?);
case "DOUBLE[]":
return typeof(double[]);
case "DOUBLE?[]":
return typeof(double?[]);
case "LIST<DOUBLE>":
return typeof(List<double>);
case "LIST<DOUBLE?>":
return typeof(List<double?>);
case "DECIMAL":
return typeof(decimal);
case "DECIMAL?":
return typeof(decimal?);
case "DECIMAL[]":
return typeof(decimal[]);
case "DECIMAL?[]":
return typeof(decimal?[]);
case "LIST<DECIMAL>":
return typeof(List<decimal>);
case "LIST<DECIMAL?>":
return typeof(List<decimal?>);
case "DATETIME":
return typeof(DateTime);
case "DATETIME?":
return typeof(DateTime?);
case "DATETIME[]":
return typeof(DateTime[]);
case "DATETIME?[]":
return typeof(DateTime?[]);
case "LIST<DATETIME>":
return typeof(List<DateTime>);
case "LIST<DATETIME?>":
return typeof(List<DateTime?>);
case "GUID":
return typeof(Guid);
case "GUID?":
return typeof(Guid?);
case "GUID[]":
return typeof(Guid[]);
case "GUID?[]":
return typeof(Guid?[]);
case "LIST<GUID>":
return typeof(List<Guid>);
case "LIST<GUID?>":
return typeof(List<Guid?>);
case "BOOL":
return typeof(bool);
case "BOOL?":
return typeof(bool?);
case "BOOL[]":
return typeof(bool[]);
case "BOOL?[]":
return typeof(bool?[]);
case "LIST<BOOL>":
return typeof(List<bool>);
case "LIST<BOOL?>":
return typeof(List<bool?>);
case "STRING":
return typeof(string);
case "STRING[]":
return typeof(string[]);
case "LIST<STRING>":
return typeof(List<string>);
default:
break;
}
return Type.GetType(name);
}
#endregion
}
/// <summary>
/// 从 Header 自动反序列化 QueryFilter 并绑定
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
public class FromFilterAttribute : Attribute, IBindingSourceMetadata, IModelNameProvider, IBinderTypeProviderMetadata
{
public FromFilterAttribute()
{
}
public BindingSource BindingSource => BindingSource.Header;
public string Name { get; set; }
public Type BinderType => typeof(FilterHeaderBinder);
}
}

@ -0,0 +1,89 @@
using System.ComponentModel.DataAnnotations;
namespace Tiobon.Core.Common
{
/// <summary>
/// 动态查询条件
/// </summary>
public class QueryFilter
{
private int _pageIndex;
/// <summary>
/// 起始位置(e.g. 0)
/// </summary>
[Required]
public int PageIndex
{
get { return _pageIndex; }
set
{
//前端默认从分页显示默认1开始,所以后端需要-1
if (value >= 1)
value -= 1;
_pageIndex = value;
}
}
/// <summary>
/// 每页数量(e.g. 10)
/// </summary>
[Required]
public int PageSize { get; set; }
private string _predicate;
/// <summary>
/// 查询条件表达式(e.g. LoginName.Contains(@0))
/// </summary>
public string Predicate
{
get { return _predicate; }
set
{
//前端默认从分页显示默认1开始,所以后端需要-1
if (value == "1=1")
value = null;
_predicate = value;
}
}
/// <summary>
/// 查询条件表达式参数(e.g. LoginName)
/// </summary>
public object[] PredicateValues { get; set; }
/// <summary>
/// 排序条件表达式(e.g. LoginName ASC,Name DESC)
/// </summary>
public string Sorting { get; set; }
///// <summary>
///// 患者关键字(姓名、别名、拼音、五笔)模糊查询
///// </summary>
//public string PatientKey { get; set; }
///// <summary>
///// 报表患者过滤条件
///// </summary>
//public PatientFilter PatientFilter { get; set; }
///// <summary>
///// 分组条件(e.g. [10,20,30])
///// </summary>
//public List<decimal> GroupValues { get; set; }
///// <summary>
///// 导出字段,按照顺序填写(e.g. [{ Key: 'PatientNameFull', Name: '患者姓名' }, { Key: 'DeviceCode', Name: '设备编号' }])
///// </summary>
//public List<ExportField> ExportFields { get; set; }
///// <summary>
///// 导出字段的宽度(默认20),按照顺序与字段一一对应填写(e.g. [20,50,20])
///// </summary>
//public List<int> ExportFieldsWidth { get; set; }
/// <summary>
/// 缺省值
/// </summary>
public static QueryFilter Default => new QueryFilter
{
PageIndex = 1,
PageSize = 100000,
Sorting = string.Empty,
Predicate = string.Empty,
PredicateValues = Array.Empty<object>(),
//GroupValues = new List<decimal>(),
//ExportFields = new List<ExportField>(),
//ExportFieldsWidth = new List<int>()
};
}
}

@ -0,0 +1,56 @@
using System.Linq.Expressions;
namespace Tiobon.Core.Common.Helper;
public static class ExpressionCombiner
{
public static Expression<Func<T, bool>> Combine<T>(Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
{
if (expression1 == null && expression2 == null)
{
return null;
}
if (expression1 == null)
{
return expression2;
}
if (expression2 == null)
{
return expression1;
}
var parameter = Expression.Parameter(typeof(T));
var leftVisitor = new ReplaceExpressionVisitor(expression1.Parameters[0], parameter);
var left = leftVisitor.Visit(expression1.Body);
var rightVisitor = new ReplaceExpressionVisitor(expression2.Parameters[0], parameter);
var right = rightVisitor.Visit(expression2.Body);
return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(left, right), parameter);
}
class ReplaceExpressionVisitor : ExpressionVisitor
{
private readonly Expression _oldValue;
private readonly Expression _newValue;
public ReplaceExpressionVisitor(Expression oldValue, Expression newValue)
{
_oldValue = oldValue;
_newValue = newValue;
}
public override Expression Visit(Expression node)
{
if (node == _oldValue)
{
return _newValue;
}
return base.Visit(node);
}
}
}

@ -9,6 +9,7 @@ namespace Tiobon.Core.Common.Seed
public class FrameSeed
{
public static string path = AppDomain.CurrentDomain.BaseDirectory.Replace("Tiobon.Core.Api\\bin\\Debug\\net8.0\\", null);
/// <summary>
/// 生成Controller层
/// </summary>
@ -19,7 +20,7 @@ namespace Tiobon.Core.Common.Seed
/// <returns></returns>
public static bool CreateControllers(SqlSugarScope sqlSugarClient, string ConnId = null, bool isMuti = false, string[] tableNames = null)
{
Create_Controller_ClassFileByDBTalbe(sqlSugarClient, ConnId, $@"C:\my-file\Tiobon.Core.Api\Controllers", "Tiobon.Core.Api.Controllers", tableNames, "", isMuti);
Create_Controller_ClassFileByDBTalbe(sqlSugarClient, ConnId, path + $@"Tiobon.Core.Api\Controllers", "Tiobon.Core.Api.Controllers", tableNames, "", isMuti);
return true;
}
@ -33,7 +34,7 @@ namespace Tiobon.Core.Common.Seed
/// <returns></returns>
public static bool CreateModels(SqlSugarScope sqlSugarClient, string ConnId, bool isMuti = false, string[] tableNames = null)
{
Create_Model_ClassFileByDBTalbe(sqlSugarClient, ConnId, $@"C:\my-file\Tiobon.Core.Model", "Tiobon.Core.Model.Models", tableNames, "", isMuti);
Create_Model_ClassFileByDBTalbe(sqlSugarClient, ConnId, path + $@"Tiobon.Core.Model", "Tiobon.Core.Model.Models", tableNames, "", isMuti);
return true;
}
@ -47,7 +48,7 @@ namespace Tiobon.Core.Common.Seed
/// <returns></returns>
public static bool CreateIRepositorys(SqlSugarScope sqlSugarClient, string ConnId, bool isMuti = false, string[] tableNames = null)
{
Create_IRepository_ClassFileByDBTalbe(sqlSugarClient, ConnId, $@"C:\my-file\Tiobon.Core.IRepository", "Tiobon.Core.IRepository", tableNames, "", isMuti);
Create_IRepository_ClassFileByDBTalbe(sqlSugarClient, ConnId, path + $@"Tiobon.Core.IRepository", "Tiobon.Core.IRepository", tableNames, "", isMuti);
return true;
}
@ -63,7 +64,7 @@ namespace Tiobon.Core.Common.Seed
/// <returns></returns>
public static bool CreateIServices(SqlSugarScope sqlSugarClient, string ConnId, bool isMuti = false, string[] tableNames = null)
{
Create_IServices_ClassFileByDBTalbe(sqlSugarClient, ConnId, $@"C:\my-file\Tiobon.Core.IServices", "Tiobon.Core.IServices", tableNames, "", isMuti);
Create_IServices_ClassFileByDBTalbe(sqlSugarClient, ConnId, path + $@"Tiobon.Core.IServices", "Tiobon.Core.IServices", tableNames, "", isMuti);
return true;
}
@ -79,7 +80,7 @@ namespace Tiobon.Core.Common.Seed
/// <returns></returns>
public static bool CreateRepository(SqlSugarScope sqlSugarClient, string ConnId, bool isMuti = false, string[] tableNames = null)
{
Create_Repository_ClassFileByDBTalbe(sqlSugarClient, ConnId, $@"C:\my-file\Tiobon.Core.Repository", "Tiobon.Core.Repository", tableNames, "", isMuti);
Create_Repository_ClassFileByDBTalbe(sqlSugarClient, ConnId, path + $@"Tiobon.Core.Repository", "Tiobon.Core.Repository", tableNames, "", isMuti);
return true;
}
@ -95,7 +96,7 @@ namespace Tiobon.Core.Common.Seed
/// <returns></returns>
public static bool CreateServices(SqlSugarScope sqlSugarClient, string ConnId, bool isMuti = false, string[] tableNames = null)
{
Create_Services_ClassFileByDBTalbe(sqlSugarClient, ConnId, $@"C:\my-file\Tiobon.Core.Services", "Tiobon.Core.Services", tableNames, "", isMuti);
Create_Services_ClassFileByDBTalbe(sqlSugarClient, ConnId, path + $@"Tiobon.Core.Services", "Tiobon.Core.Services", tableNames, "", isMuti);
return true;
}
@ -155,7 +156,7 @@ namespace Tiobon.Core.Common.Seed
#region 查询
[HttpGet]
public async Task<MessageModel<PageModel<{ClassName}>>> Get(int page = 1, string key = """",int intPageSize = 50)
public async Task<MessageModel<PageModel<{ClassName}>>> Get(int page = 1, string key = """",int pageSize = 50)
{
if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key))
key = """";
@ -166,7 +167,7 @@ namespace Tiobon.Core.Common.Seed
{
msg = """",
success = true,
response = await _{ClassName}Services.QueryPage(whereExpression, page, intPageSize)
response = await _{ClassName}Services.QueryPage(whereExpression, page, pageSize)
};
}

@ -1,6 +1,7 @@
using System.Data;
using System.Linq.Expressions;
using SqlSugar;
using Tiobon.Core.Common;
using Tiobon.Core.Model;
namespace Tiobon.Core.IServices.BASE
@ -51,6 +52,7 @@ namespace Tiobon.Core.IServices.BASE
Task<PageModel<TEntity>> QueryPage(Expression<Func<TEntity, bool>> whereExpression, int pageIndex = 1, int pageSize = 20, string orderByFields = null);
Task<PageModel<TEntity>> QueryFilterPage([FromFilter] QueryFilter filter);
Task<List<TResult>> QueryMuch<T, T2, T3, TResult>(
Expression<Func<T, T2, T3, object[]>> joinExpression,

@ -0,0 +1,12 @@
using Tiobon.Core.IServices.BASE;
using Tiobon.Core.Model.Models;
namespace Tiobon.Core.IServices
{
/// <summary>
/// IGhra_GradeServices
/// </summary>
public interface IGhra_GradeServices :IBaseServices<Ghra_Grade>
{
}
}

@ -0,0 +1,194 @@
using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace Tiobon.Core.Model.Models
{
///<summary>
///
///</summary>
[SugarTable( "Ghra_Grade", "wmtiobon_mssql_main")]
public class Ghra_Grade
{
public Ghra_Grade()
{
}
/// <summary>
/// Desc:
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
public int Id { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string GradeNo { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string GradeName { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string MKey { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public int? DataBelongID { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string RemarkSz { get; set; }
/// <summary>
/// Desc:
/// Default:1
/// Nullable:False
/// </summary>
public int SortNo { get; set; }
/// <summary>
/// Desc:
/// Default:1
/// Nullable:False
/// </summary>
public int IsEnable { get; set; }
/// <summary>
/// Desc:
/// Default:1
/// Nullable:False
/// </summary>
public int IsDefault { get; set; }
/// <summary>
/// Desc:
/// Default:0
/// Nullable:True
/// </summary>
public long? OperateLogID { get; set; }
/// <summary>
/// Desc:
/// Default:0
/// Nullable:False
/// </summary>
public int CreateBy { get; set; }
/// <summary>
/// Desc:
/// Default:DateTime.Now
/// Nullable:False
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string CreateProg { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string CreateIP { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public int? UpdateBy { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public DateTime? UpdateTime { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string UpdateProg { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string UpdateIP { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string Reverse1 { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string Reverse2 { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string Reverse3 { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string Reverse4 { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string Reverse5 { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string Reverse6 { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string Reverse7 { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string Reverse8 { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public string Reverse9 { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public int? ReverseI1 { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:True
/// </summary>
public int? ReverseI2 { get; set; }
}
}

@ -1,4 +1,5 @@
using System.Data;
using System.Linq.Dynamic.Core;
using System.Linq.Expressions;
using System.Reflection;
using SqlSugar;
@ -9,6 +10,7 @@ using Tiobon.Core.Model;
using Tiobon.Core.Model.Models;
using Tiobon.Core.Model.Tenants;
using Tiobon.Core.Repository.UnitOfWorks;
using static Org.BouncyCastle.Math.EC.ECCurve;
namespace Tiobon.Core.Repository.Base
{
@ -434,6 +436,33 @@ namespace Tiobon.Core.Repository.Base
return new PageModel<TEntity>(pageIndex, totalCount, pageSize, list);
}
/// <summary>
/// 分页查询[使用版本,其他分页未测试]
/// </summary>
/// <param name="whereExpression">条件表达式</param>
/// <param name="pageIndex">页码(下标0)</param>
/// <param name="pageSize">页大小</param>
/// <param name="orderByFields">排序字段,如name asc,age desc</param>
/// <returns></returns>
public async Task<PageModel<TEntity>> QueryFilterPage([FromFilter] QueryFilter filter)
{
RefAsync<int> totalCount = 0;
var query = _db.Queryable<TEntity>();
if (!filter.Predicate.IsNullOrEmpty())
{
for (int i = 0; i < filter.PredicateValues.Length; i++)
{
filter.Predicate = filter.Predicate.Replace($"@{i}", filter.PredicateValues[i].ToString());
}
query = query.Where(filter.Predicate);
}
var list = await query
.OrderByIF(!string.IsNullOrEmpty(filter.Sorting), filter.Sorting)
.ToPageListAsync(filter.PageIndex, filter.PageSize, totalCount);
return new PageModel<TEntity>(filter.PageIndex, totalCount, filter.PageSize, list);
}
/// <summary>
@ -616,6 +645,44 @@ namespace Tiobon.Core.Repository.Base
return await _db.Queryable<TEntity>().In(objId).SplitTable(tabs => tabs).SingleAsync();
}
/// <summary>
/// 数据过滤用的查询表达式构建
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <returns></returns>
protected Expression<Func<TEntity, bool>> CreateFilterExpression<TEntity>()
where TEntity : class
{
Expression<Func<TEntity, bool>> expression = null;
//if (typeof(ISoftDelete).IsAssignableFrom(typeof(TEntity)))
//{
// Expression<Func<TEntity, bool>> softDeleteFilter = e => !((ISoftDelete)e).IsDeleted;
// expression = expression == null ? softDeleteFilter : CombineExpressions(expression, softDeleteFilter);
//}
if (typeof(IMayHaveTenant).IsAssignableFrom(typeof(TEntity)))// && IsMayHaveTenantFilterEnabled)
{
Expression<Func<TEntity, bool>> mayHaveTenantFilter =
e => ((IMayHaveTenant)e).IsEnable == 1;
expression = expression == null
? mayHaveTenantFilter
: CombineExpressions(expression, mayHaveTenantFilter);
}
return expression;
}
protected Expression<Func<T, bool>> CombineExpressions<T>(
Expression<Func<T, bool>> expression1, Expression<Func<T, bool>> expression2)
{
return Common.Helper.ExpressionCombiner.Combine(expression1, expression2);
}
#endregion
}
public interface IMayHaveTenant
{
int IsEnable { get; set; }
}
}

@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.Data;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Tiobon.Core.Common;
namespace Tiobon.Core.IRepository.Base
{
@ -155,6 +156,16 @@ namespace Tiobon.Core.IRepository.Base
/// <returns></returns>
Task<PageModel<TEntity>> QueryPage(Expression<Func<TEntity, bool>> whereExpression, int pageIndex = 1, int pageSize = 20, string orderByFields = null);
/// <summary>
/// 根据表达式,排序字段,分页查询
/// </summary>
/// <param name="whereExpression"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="orderByFields"></param>
/// <returns></returns>
Task<PageModel<TEntity>> QueryFilterPage([FromFilter] QueryFilter filter);
/// <summary>
/// 三表联查
/// </summary>

@ -1,6 +1,7 @@
using System.Data;
using System.Linq.Expressions;
using SqlSugar;
using Tiobon.Core.Common;
using Tiobon.Core.Common.Helper;
using Tiobon.Core.IRepository.Base;
using Tiobon.Core.IServices.BASE;
@ -315,6 +316,11 @@ namespace Tiobon.Core.Services.BASE
pageIndex, pageSize, orderByFileds);
}
public async Task<PageModel<TEntity>> QueryFilterPage([FromFilter] QueryFilter filter)
{
return await BaseDal.QueryFilterPage(filter);
}
public async Task<List<TResult>> QueryMuch<T, T2, T3, TResult>(Expression<Func<T, T2, T3, object[]>> joinExpression, Expression<Func<T, T2, T3, TResult>> selectExpression, Expression<Func<T, T2, T3, bool>> whereLambda = null) where T : class, new()
{
return await BaseDal.QueryMuch(joinExpression, selectExpression, whereLambda);

@ -0,0 +1,18 @@

using Tiobon.Core.IServices;
using Tiobon.Core.Model.Models;
using Tiobon.Core.Services.BASE;
using Tiobon.Core.IRepository.Base;
namespace Tiobon.Core.Services
{
public class Ghra_GradeServices : BaseServices<Ghra_Grade>, IGhra_GradeServices
{
private readonly IBaseRepository<Ghra_Grade> _dal;
public Ghra_GradeServices(IBaseRepository<Ghra_Grade> dal)
{
this._dal = dal;
base.BaseDal = dal;
}
}
}
Loading…
Cancel
Save