From 43dae6057ef9204c922ba413316ee9a3a63e9c82 Mon Sep 17 00:00:00 2001 From: liukuo362573 Date: Thu, 6 Apr 2023 11:06:27 +0800 Subject: [PATCH 1/4] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a38d6e85..32e59619 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ 2. 创建开发分支 (`git checkout -b dev`) 3. 提交更改 (`git commit -m 'Add something'`) 4. 推送到分支 (`git push origin dev`) -5. 提[Pull Request](https://github.com/liukuo362573/YiShaAdmin/compare) +5. 提[Pull Request](https://github.com/liukuo362573/YiShaAdmin/compare),建议每一个小功能提一个 PR ## License From 50b2e83db6dc8e85335b8b997c79f5c8cc0a799e Mon Sep 17 00:00:00 2001 From: liukuo362573 Date: Thu, 6 Apr 2023 11:15:16 +0800 Subject: [PATCH 2/4] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 32e59619..f9006811 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,8 @@ | YiShaAdmin 版本 | .NET Core 版本 | 是否支持 | 链接 | Developer | |:-----|:-----|:-----|:-----|:-----| -| 6.0 | 6.0 | 支持(开发中,不建议商用) | [YiShaAdmin-Net6.0](https://github.com/liukuo362573/YiShaAdmin/tree/YiShaAdmin-Net6) | [zgcwkj](https://github.com/zgcwkj) | +| 7.0 | 7.0 | 支持 | [YiShaAdmin-Net7.0](https://github.com/liukuo362573/YiShaAdmin/tree/YiShaAdmin-Net7) | [luckearth](https://github.com/luckearth) | +| 6.0 | 6.0 | 支持 | [YiShaAdmin-Net6.0](https://github.com/liukuo362573/YiShaAdmin/tree/YiShaAdmin-Net6) | [zgcwkj](https://github.com/zgcwkj) | | 3.1 | 3.1 | 支持 | [YiShaAdmin-Net3.1](https://github.com/liukuo362573/YiShaAdmin/tree/master) | | | 2.2 | 2.2 | 支持 | [YiShaAdmin-Net2.2](https://github.com/liukuo362573/YiShaAdmin/releases/tag/v2.2)| | From 8f298c9926b8dbee594dadbaf1818cbe627f2931 Mon Sep 17 00:00:00 2001 From: liukuo362573 Date: Sat, 17 Jun 2023 15:44:23 +0800 Subject: [PATCH 3/4] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index f9006811..8c5e2574 100644 --- a/README.md +++ b/README.md @@ -32,9 +32,11 @@ 文档地址:[https://www.toolhelper.cn/doc](http://www.toolhelper.cn/doc) + ## 演示图 From 361d979540b87bd739ccfbbd26bb83fb99ccde6e Mon Sep 17 00:00:00 2001 From: jhzou1 Date: Fri, 1 Sep 2023 15:53:56 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E8=A1=A8=E8=BE=BE=E5=BC=8F=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=A2=9E=E5=8A=A0=E5=AD=97=E6=AE=B5=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OrganizationManage/UserService.cs | 40 +++-- .../YiSha.Util/Extension/Extension.Linq.cs | 143 ++++++++++++++++++ .../YiSha.Admin.Web/YiSha.Admin.Web.csproj | 2 + YiSha.Web/YiSha.Admin.Web/appsettings.json | 32 ++-- 4 files changed, 188 insertions(+), 29 deletions(-) diff --git a/YiSha.Business/YiSha.Service/OrganizationManage/UserService.cs b/YiSha.Business/YiSha.Service/OrganizationManage/UserService.cs index 4cbf345f..0412d829 100644 --- a/YiSha.Business/YiSha.Service/OrganizationManage/UserService.cs +++ b/YiSha.Business/YiSha.Service/OrganizationManage/UserService.cs @@ -166,26 +166,40 @@ public async Task ChangeUser(UserEntity entity) #region 私有方法 private Expression> ListFilter(UserListParam param) { - var expression = LinqExtensions.True(); + + //var expression = LinqExtensions.True(); + + if (param.UserStatus == -1) + { + param.UserStatus = null; + } + + //****根据查询字段自动过滤条件**** + var expression = LinqExtensions.GetExpressionItems(param); + if (param != null) { - if (!string.IsNullOrEmpty(param.UserName)) - { - expression = expression.And(t => t.UserName.Contains(param.UserName)); - } + //if (!string.IsNullOrEmpty(param.UserName)) + //{ + // expression = expression.And(t => t.UserName.Contains(param.UserName)); + //} + + if (!string.IsNullOrEmpty(param.UserIds)) { long[] userIdList = TextHelper.SplitToArray(param.UserIds, ','); expression = expression.And(t => userIdList.Contains(t.Id.Value)); } - if (!string.IsNullOrEmpty(param.Mobile)) - { - expression = expression.And(t => t.Mobile.Contains(param.Mobile)); - } - if (param.UserStatus > -1) - { - expression = expression.And(t => t.UserStatus == param.UserStatus); - } + + //if (!string.IsNullOrEmpty(param.Mobile)) + //{ + // expression = expression.And(t => t.Mobile.Contains(param.Mobile)); + //} + //if (param.UserStatus > -1) + //{ + // expression = expression.And(t => t.UserStatus == param.UserStatus); + //} + if (!string.IsNullOrEmpty(param.StartTime.ParseToString())) { expression = expression.And(t => t.BaseModifyTime >= param.StartTime); diff --git a/YiSha.Util/YiSha.Util/Extension/Extension.Linq.cs b/YiSha.Util/YiSha.Util/Extension/Extension.Linq.cs index 19dffdf3..b6d31cea 100644 --- a/YiSha.Util/YiSha.Util/Extension/Extension.Linq.cs +++ b/YiSha.Util/YiSha.Util/Extension/Extension.Linq.cs @@ -63,6 +63,148 @@ static Expression Compose(this Expression first, Expression second, return Expression.Lambda(merge(first.Body, secondBody), first.Parameters); } + /// + /// #jhzou0616 根据数据类型获取实体表达式(目前仅支持string/日期范围 的条件筛选),字段属性名称必须匹配** 日期范围字段必须以 xxxStart/xxxEnd 结尾 + /// + /// + /// + /// + public static Expression> GetExpressionItems(TT input) + { + var parameter = Expression.Parameter(typeof(T), "entity"); + Expression expression = Expression.Constant(true); + + var properties = typeof(TT).GetProperties(); + + var targetProperties = typeof(T).GetProperties(); + + foreach (var property in properties) + { + //字符类型筛选 + if (property.PropertyType == typeof(string)) + { + + + var value = property.GetValue(input); + + if (value != null && !string.IsNullOrEmpty(value.ToString())) + { + var propertyExpression = Expression.Property(parameter, property.Name); + var valueExpression = Expression.Constant(value); + var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) }); + var containsExpression = Expression.Call(propertyExpression, containsMethod, valueExpression); + expression = Expression.AndAlso(expression, containsExpression); + } + } + //日期类型筛选 + else if (property.PropertyType == typeof(DateTime) || property.PropertyType == typeof(DateTime?)) + { + var value = property.GetValue(input); + + if (value != null) + { + // 开始日期筛选 + if (property.Name.Contains("Start")) + { + var realPropertyName = property.Name.Substring(0, property.Name.Length - "Start".Length); + var propertyExpression = Expression.Property(parameter, realPropertyName); + var entityfield = targetProperties.FirstOrDefault(s => s.Name == realPropertyName); + var startDateTime = (DateTime)value; + + if (entityfield.PropertyType == typeof(DateTime?)) + { + var greaterThanOrEqualExpression = Expression.GreaterThanOrEqual(propertyExpression, Expression.Constant(startDateTime, typeof(DateTime?))); + expression = Expression.AndAlso(expression, greaterThanOrEqualExpression); + } + else + { + var greaterThanOrEqualExpression = Expression.GreaterThanOrEqual(propertyExpression, Expression.Constant(startDateTime)); + expression = Expression.AndAlso(expression, greaterThanOrEqualExpression); + } + + } + // 结束日期筛选 + else if (property.Name.Contains("End")) + { + var realPropertyName = property.Name.Substring(0, property.Name.Length - "End".Length); + var propertyExpression = Expression.Property(parameter, realPropertyName); + var entityfield = targetProperties.FirstOrDefault(s => s.Name == realPropertyName); + var endDateTime = ((DateTime)value).Date.AddDays(1).AddTicks(-1); + + if (entityfield.PropertyType == typeof(DateTime?)) + { + var lessThanOrEqualExpression = Expression.LessThanOrEqual(propertyExpression, Expression.Constant(endDateTime, typeof(DateTime?))); + expression = Expression.AndAlso(expression, lessThanOrEqualExpression); + } + else + { + var lessThanOrEqualExpression = Expression.LessThanOrEqual(propertyExpression, Expression.Constant(endDateTime)); + expression = Expression.AndAlso(expression, lessThanOrEqualExpression); + } + + } + // 其他日期属性 + else + { + var propertyExpression = Expression.Property(parameter, property.Name); + var equalExpression = Expression.Equal(propertyExpression, Expression.Constant(value)); + expression = Expression.AndAlso(expression, equalExpression); + } + } + + } + //数值类型 + else if (property.PropertyType == typeof(int?) || property.PropertyType == typeof(int)) + { + var value = property.GetValue(input); + var propertyExpression = Expression.Property(parameter, property.Name); + var entityfield = targetProperties.FirstOrDefault(s => s.Name == property.Name); + + if (value != null) + { + if (entityfield.PropertyType == typeof(int?)) + { + var equalExpression = Expression.Equal(propertyExpression, Expression.Constant(value, typeof(int?))); + expression = Expression.AndAlso(expression, equalExpression); + } + else + { + var equalExpression = Expression.Equal(propertyExpression, Expression.Constant(value)); + expression = Expression.AndAlso(expression, equalExpression); + } + + } + + } + //float + else if (property.PropertyType == typeof(float?) || property.PropertyType == typeof(float)) + { + var value = property.GetValue(input); + var propertyExpression = Expression.Property(parameter, property.Name); + var entityfield = targetProperties.FirstOrDefault(s => s.Name == property.Name); + + if (value != null) + { + if (entityfield.PropertyType == typeof(float?)) + { + var equalExpression = Expression.Equal(propertyExpression, Expression.Constant(value, typeof(float?))); + expression = Expression.AndAlso(expression, equalExpression); + } + else + { + var equalExpression = Expression.Equal(propertyExpression, Expression.Constant(value)); + expression = Expression.AndAlso(expression, equalExpression); + } + + } + + } + + } + + return Expression.Lambda>(expression, parameter); + } + /// /// ParameterRebinder /// @@ -105,6 +247,7 @@ protected override Expression VisitParameter(ParameterExpression p) } return base.VisitParameter(p); } + } } } diff --git a/YiSha.Web/YiSha.Admin.Web/YiSha.Admin.Web.csproj b/YiSha.Web/YiSha.Admin.Web/YiSha.Admin.Web.csproj index aa73d6bc..1921cfd4 100644 --- a/YiSha.Web/YiSha.Admin.Web/YiSha.Admin.Web.csproj +++ b/YiSha.Web/YiSha.Admin.Web/YiSha.Admin.Web.csproj @@ -33,4 +33,6 @@ + + diff --git a/YiSha.Web/YiSha.Admin.Web/appsettings.json b/YiSha.Web/YiSha.Admin.Web/appsettings.json index b2984a98..caecc33a 100644 --- a/YiSha.Web/YiSha.Admin.Web/appsettings.json +++ b/YiSha.Web/YiSha.Admin.Web/appsettings.json @@ -5,20 +5,20 @@ } }, "AllowedHosts": "*", - "SystemConfig": { - "Demo": false, // 是否是演示模式 - "LoginMultiple": true, // 是否允许一个账户在多处登录 - "LoginProvider": "Cookie", // 登录信息保存方式 Cookie Session WebApi - "SnowFlakeWorkerId": 1, // SnowFlake 节点序号 - "ApiSite": "http://localhost:5001", // Api地址,例如可以上传文件到Api - "VirtualDirectory": "/admin", // 虚拟目录 - - "DBProvider": "MySql", - "DBConnectionString": "server=localhost;database=YiShaAdmin;user=root;password=123456;port=3306;pooling=true;max pool size=20;persist security info=True;charset=utf8mb4;", - "DBCommandTimeout": 180, // 数据库超时时间,单位秒 - "DBBackup": "", // 数据库备份路径 - - "CacheProvider": "Memory", // 缓存使用方式 Memory Redis - "RedisConnectionString": "127.0.0.1:6379" - } + "SystemConfig": { + "Demo": false, // 是否是演示模式 + "LoginMultiple": true, // 是否允许一个账户在多处登录 + "LoginProvider": "Cookie", // 登录信息保存方式 Cookie Session WebApi + "SnowFlakeWorkerId": 1, // SnowFlake 节点序号 + "ApiSite": "http://localhost:5001", // Api地址,例如可以上传文件到Api + "VirtualDirectory": "/admin", // 虚拟目录 + + "DBProvider": "SqlServer", + "DBConnectionString": "Server=localhost;User Id=sa;Password=hmAdmin@;Database=YsData;", + "DBCommandTimeout": 180, // 数据库超时时间,单位秒 + "DBBackup": "", // 数据库备份路径 + + "CacheProvider": "Memory", // 缓存使用方式 Memory Redis + "RedisConnectionString": "127.0.0.1:6379" + } }