😎代码清理及优化
This commit is contained in:
parent
681b8adb2f
commit
be89e2f4d9
@ -167,7 +167,7 @@ dotnet_style_prefer_inferred_tuple_names = true:suggestion
|
|||||||
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
|
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
|
||||||
dotnet_style_prefer_compound_assignment = true:suggestion
|
dotnet_style_prefer_compound_assignment = true:suggestion
|
||||||
dotnet_style_prefer_simplified_interpolation = true:suggestion
|
dotnet_style_prefer_simplified_interpolation = true:suggestion
|
||||||
dotnet_style_namespace_match_folder = true:suggestion
|
dotnet_style_namespace_match_folder = true:none
|
||||||
dotnet_style_predefined_type_for_locals_parameters_members = true:silent
|
dotnet_style_predefined_type_for_locals_parameters_members = true:silent
|
||||||
dotnet_style_predefined_type_for_member_access = true:silent
|
dotnet_style_predefined_type_for_member_access = true:silent
|
||||||
indent_size = 4
|
indent_size = 4
|
||||||
|
|||||||
@ -13,7 +13,7 @@ namespace Admin.NET.Core;
|
|||||||
public class CommonValidationAttribute : ValidationAttribute
|
public class CommonValidationAttribute : ValidationAttribute
|
||||||
{
|
{
|
||||||
private readonly Dictionary<string, string> _conditions;
|
private readonly Dictionary<string, string> _conditions;
|
||||||
private static readonly Dictionary<string, Delegate> CompiledConditions = new();
|
private static readonly Dictionary<string, Delegate> CompiledConditions = [];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -76,7 +76,7 @@ public class CommonValidationAttribute : ValidationAttribute
|
|||||||
var parameter = Expression.Parameter(typeof(object), "x");
|
var parameter = Expression.Parameter(typeof(object), "x");
|
||||||
|
|
||||||
// 构建 Lambda 表达式
|
// 构建 Lambda 表达式
|
||||||
var lambda = DynamicExpressionParser.ParseLambda(new[] { Expression.Parameter(modelType, "x") }, typeof(bool), expression);
|
var lambda = DynamicExpressionParser.ParseLambda([Expression.Parameter(modelType, "x")], typeof(bool), expression);
|
||||||
|
|
||||||
// 创建新的 Lambda 表达式,接受 object 参数并调用编译后的表达式
|
// 创建新的 Lambda 表达式,接受 object 参数并调用编译后的表达式
|
||||||
var invokeExpression = Expression.Invoke(lambda, Expression.Convert(parameter, modelType));
|
var invokeExpression = Expression.Invoke(lambda, Expression.Convert(parameter, modelType));
|
||||||
|
|||||||
@ -25,9 +25,11 @@ public static class CacheSetup
|
|||||||
{
|
{
|
||||||
Configuration = cacheOptions.Redis.Configuration,
|
Configuration = cacheOptions.Redis.Configuration,
|
||||||
Prefix = cacheOptions.Redis.Prefix
|
Prefix = cacheOptions.Redis.Prefix
|
||||||
});
|
})
|
||||||
// 自动检测集群节点
|
{
|
||||||
redis.AutoDetect = App.GetConfig<bool>("Cache:Redis:AutoDetect", true);
|
// 自动检测集群节点
|
||||||
|
AutoDetect = App.GetConfig<bool>("Cache:Redis:AutoDetect", true)
|
||||||
|
};
|
||||||
// 最大消息大小
|
// 最大消息大小
|
||||||
if (cacheOptions.Redis.MaxMessageSize > 0)
|
if (cacheOptions.Redis.MaxMessageSize > 0)
|
||||||
redis.MaxMessageSize = cacheOptions.Redis.MaxMessageSize;
|
redis.MaxMessageSize = cacheOptions.Redis.MaxMessageSize;
|
||||||
|
|||||||
@ -130,5 +130,5 @@ public partial class SysMenu : EntityBase
|
|||||||
/// 菜单子项
|
/// 菜单子项
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(IsIgnore = true)]
|
[SugarColumn(IsIgnore = true)]
|
||||||
public List<SysMenu> Children { get; set; } = new();
|
public List<SysMenu> Children { get; set; } = [];
|
||||||
}
|
}
|
||||||
@ -172,29 +172,16 @@ public static partial class ObjectExtension
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
int length = str.Length;
|
int length = str.Length;
|
||||||
switch (length)
|
return length switch
|
||||||
{
|
{
|
||||||
case 4:
|
4 => DateTime.ParseExact(str, "yyyy", System.Globalization.CultureInfo.CurrentCulture),
|
||||||
return DateTime.ParseExact(str, "yyyy", System.Globalization.CultureInfo.CurrentCulture);
|
6 => DateTime.ParseExact(str, "yyyyMM", System.Globalization.CultureInfo.CurrentCulture),
|
||||||
|
8 => DateTime.ParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture),
|
||||||
case 6:
|
10 => DateTime.ParseExact(str, "yyyyMMddHH", System.Globalization.CultureInfo.CurrentCulture),
|
||||||
return DateTime.ParseExact(str, "yyyyMM", System.Globalization.CultureInfo.CurrentCulture);
|
12 => DateTime.ParseExact(str, "yyyyMMddHHmm", System.Globalization.CultureInfo.CurrentCulture),
|
||||||
|
14 => DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture),
|
||||||
case 8:
|
_ => DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture),
|
||||||
return DateTime.ParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
|
};
|
||||||
|
|
||||||
case 10:
|
|
||||||
return DateTime.ParseExact(str, "yyyyMMddHH", System.Globalization.CultureInfo.CurrentCulture);
|
|
||||||
|
|
||||||
case 12:
|
|
||||||
return DateTime.ParseExact(str, "yyyyMMddHHmm", System.Globalization.CultureInfo.CurrentCulture);
|
|
||||||
|
|
||||||
case 14:
|
|
||||||
return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
|
|
||||||
|
|
||||||
default:
|
|
||||||
return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
@ -224,29 +211,16 @@ public static partial class ObjectExtension
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
int length = str.Length;
|
int length = str.Length;
|
||||||
switch (length)
|
return length switch
|
||||||
{
|
{
|
||||||
case 4:
|
4 => DateTime.ParseExact(str, "yyyy", System.Globalization.CultureInfo.CurrentCulture),
|
||||||
return DateTime.ParseExact(str, "yyyy", System.Globalization.CultureInfo.CurrentCulture);
|
6 => DateTime.ParseExact(str, "yyyyMM", System.Globalization.CultureInfo.CurrentCulture),
|
||||||
|
8 => DateTime.ParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture),
|
||||||
case 6:
|
10 => DateTime.ParseExact(str, "yyyyMMddHH", System.Globalization.CultureInfo.CurrentCulture),
|
||||||
return DateTime.ParseExact(str, "yyyyMM", System.Globalization.CultureInfo.CurrentCulture);
|
12 => DateTime.ParseExact(str, "yyyyMMddHHmm", System.Globalization.CultureInfo.CurrentCulture),
|
||||||
|
14 => DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture),
|
||||||
case 8:
|
_ => DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture),
|
||||||
return DateTime.ParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
|
};
|
||||||
|
|
||||||
case 10:
|
|
||||||
return DateTime.ParseExact(str, "yyyyMMddHH", System.Globalization.CultureInfo.CurrentCulture);
|
|
||||||
|
|
||||||
case 12:
|
|
||||||
return DateTime.ParseExact(str, "yyyyMMddHHmm", System.Globalization.CultureInfo.CurrentCulture);
|
|
||||||
|
|
||||||
case 14:
|
|
||||||
return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
|
|
||||||
|
|
||||||
default:
|
|
||||||
return DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
@ -335,7 +309,7 @@ public static partial class ObjectExtension
|
|||||||
{
|
{
|
||||||
if (!email.TryValidate(ValidationTypes.EmailAddress).IsValid) return email;
|
if (!email.TryValidate(ValidationTypes.EmailAddress).IsValid) return email;
|
||||||
|
|
||||||
var pos = email.IndexOf("@");
|
var pos = email.IndexOf('@');
|
||||||
return Mask(email[..pos], mask) + email[pos..];
|
return Mask(email[..pos], mask) + email[pos..];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -351,10 +325,10 @@ public static partial class ObjectExtension
|
|||||||
{
|
{
|
||||||
if (!string.IsNullOrWhiteSpace(str))
|
if (!string.IsNullOrWhiteSpace(str))
|
||||||
{
|
{
|
||||||
MethodInfo method = typeof(T).GetMethod("Parse", new Type[] { typeof(string) });
|
MethodInfo method = typeof(T).GetMethod("Parse", [typeof(string)]);
|
||||||
if (method != null)
|
if (method != null)
|
||||||
{
|
{
|
||||||
T result = (T)method.Invoke(null, new string[] { str });
|
T result = (T)method.Invoke(null, [str]);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -384,14 +358,13 @@ public static partial class ObjectExtension
|
|||||||
if (type.Name.StartsWith("Nullable"))
|
if (type.Name.StartsWith("Nullable"))
|
||||||
_type = type.GetGenericArguments()[0];
|
_type = type.GetGenericArguments()[0];
|
||||||
|
|
||||||
MethodInfo method = _type.GetMethod("Parse", new Type[] { typeof(string) });
|
MethodInfo method = _type.GetMethod("Parse", [typeof(string)]);
|
||||||
if (method != null)
|
if (method != null)
|
||||||
return method.Invoke(null, new string[] { str });
|
return method.Invoke(null, [str]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{ }
|
||||||
}
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -369,7 +369,7 @@ public static class RepositoryExtension
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static List<T> Where<T>(this T thisValue, Func<T, bool> whereExpression) where T : class, new()
|
public static List<T> Where<T>(this T thisValue, Func<T, bool> whereExpression) where T : class, new()
|
||||||
{
|
{
|
||||||
return new List<T>() { thisValue };
|
return [thisValue];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -382,7 +382,7 @@ public static class RepositoryExtension
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static List<T> WhereIF<T>(this T thisValue, bool isWhere, Func<T, bool> whereExpression) where T : class, new()
|
public static List<T> WhereIF<T>(this T thisValue, bool isWhere, Func<T, bool> whereExpression) where T : class, new()
|
||||||
{
|
{
|
||||||
return new List<T>() { thisValue };
|
return [thisValue];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -395,7 +395,7 @@ public static class RepositoryExtension
|
|||||||
public static IUpdateable<T> OnlyUpdateColumn<T, R>(this IUpdateable<T> updateable) where T : EntityBase, new() where R : class, new()
|
public static IUpdateable<T> OnlyUpdateColumn<T, R>(this IUpdateable<T> updateable) where T : EntityBase, new() where R : class, new()
|
||||||
{
|
{
|
||||||
if (updateable.UpdateBuilder.UpdateColumns == null)
|
if (updateable.UpdateBuilder.UpdateColumns == null)
|
||||||
updateable.UpdateBuilder.UpdateColumns = new List<string>();
|
updateable.UpdateBuilder.UpdateColumns = [];
|
||||||
|
|
||||||
foreach (PropertyInfo info in typeof(R).GetProperties())
|
foreach (PropertyInfo info in typeof(R).GetProperties())
|
||||||
{
|
{
|
||||||
|
|||||||
@ -15,9 +15,7 @@ public static class SqlSugarExtension
|
|||||||
{
|
{
|
||||||
public static ISugarQueryable<T> SearchBy<T>(this ISugarQueryable<T> queryable, BaseFilter filter)
|
public static ISugarQueryable<T> SearchBy<T>(this ISugarQueryable<T> queryable, BaseFilter filter)
|
||||||
{
|
{
|
||||||
return queryable.SearchByKeyword(filter.Keyword)
|
return queryable.SearchByKeyword(filter.Keyword).AdvancedSearch(filter.Search).AdvancedFilter(filter.Filter);
|
||||||
.AdvancedSearch(filter.Search)
|
|
||||||
.AdvancedFilter(filter.Filter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ISugarQueryable<T> SearchByKeyword<T>(this ISugarQueryable<T> queryable, string keyword)
|
public static ISugarQueryable<T> SearchByKeyword<T>(this ISugarQueryable<T> queryable, string keyword)
|
||||||
@ -33,36 +31,30 @@ public static class SqlSugarExtension
|
|||||||
|
|
||||||
Expression right = Expression.Constant(false);
|
Expression right = Expression.Constant(false);
|
||||||
|
|
||||||
if (search.Fields?.Any() is true)
|
if (search.Fields?.Count != 0)
|
||||||
{
|
{
|
||||||
foreach (string field in search.Fields)
|
foreach (string field in search.Fields)
|
||||||
{
|
{
|
||||||
MemberExpression propertyExpr = GetPropertyExpression(field, paramExpr);
|
MemberExpression propertyExpr = GetPropertyExpression(field, paramExpr);
|
||||||
|
|
||||||
var left = AddSearchPropertyByKeyword<T>(propertyExpr, search.Keyword);
|
var left = AddSearchPropertyByKeyword<T>(propertyExpr, search.Keyword);
|
||||||
|
|
||||||
right = Expression.Or(left, right);
|
right = Expression.Or(left, right);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var properties = typeof(T).GetProperties()
|
var properties = typeof(T).GetProperties().Where(prop => Nullable.GetUnderlyingType(prop.PropertyType) == null
|
||||||
.Where(prop => Nullable.GetUnderlyingType(prop.PropertyType) == null
|
&& !prop.PropertyType.IsEnum
|
||||||
&& !prop.PropertyType.IsEnum
|
&& Type.GetTypeCode(prop.PropertyType) != TypeCode.Object);
|
||||||
&& Type.GetTypeCode(prop.PropertyType) != TypeCode.Object);
|
|
||||||
|
|
||||||
foreach (var property in properties)
|
foreach (var property in properties)
|
||||||
{
|
{
|
||||||
var propertyExpr = Expression.Property(paramExpr, property);
|
var propertyExpr = Expression.Property(paramExpr, property);
|
||||||
|
|
||||||
var left = AddSearchPropertyByKeyword<T>(propertyExpr, search.Keyword);
|
var left = AddSearchPropertyByKeyword<T>(propertyExpr, search.Keyword);
|
||||||
|
|
||||||
right = Expression.Or(left, right);
|
right = Expression.Or(left, right);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var lambda = Expression.Lambda<Func<T, bool>>(right, paramExpr);
|
var lambda = Expression.Lambda<Func<T, bool>>(right, paramExpr);
|
||||||
|
|
||||||
return queryable.Where(lambda);
|
return queryable.Where(lambda);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,10 +87,7 @@ public static class SqlSugarExtension
|
|||||||
return queryable;
|
return queryable;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Expression CombineFilter(
|
private static Expression CombineFilter(FilterLogicEnum filterLogic, Expression bExpresionBase, Expression bExpresion)
|
||||||
FilterLogicEnum filterLogic,
|
|
||||||
Expression bExpresionBase,
|
|
||||||
Expression bExpresion)
|
|
||||||
{
|
{
|
||||||
return filterLogic switch
|
return filterLogic switch
|
||||||
{
|
{
|
||||||
@ -116,10 +105,7 @@ public static class SqlSugarExtension
|
|||||||
return filter;
|
return filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Expression CreateFilterExpression(
|
private static Expression CreateFilterExpression(FilterLogicEnum filterLogic, IEnumerable<Filter> filters, ParameterExpression parameter)
|
||||||
FilterLogicEnum filterLogic,
|
|
||||||
IEnumerable<Filter> filters,
|
|
||||||
ParameterExpression parameter)
|
|
||||||
{
|
{
|
||||||
Expression filterExpression = default!;
|
Expression filterExpression = default!;
|
||||||
|
|
||||||
@ -144,21 +130,14 @@ public static class SqlSugarExtension
|
|||||||
return filterExpression;
|
return filterExpression;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Expression CreateFilterExpression(
|
private static Expression CreateFilterExpression(string field, FilterOperatorEnum filterOperator, object? value, ParameterExpression parameter)
|
||||||
string field,
|
|
||||||
FilterOperatorEnum filterOperator,
|
|
||||||
object? value,
|
|
||||||
ParameterExpression parameter)
|
|
||||||
{
|
{
|
||||||
var propertyExpresion = GetPropertyExpression(field, parameter);
|
var propertyExpresion = GetPropertyExpression(field, parameter);
|
||||||
var valueExpresion = GeValuetExpression(field, value, propertyExpresion.Type);
|
var valueExpresion = GeValuetExpression(field, value, propertyExpresion.Type);
|
||||||
return CreateFilterExpression(propertyExpresion, valueExpresion, filterOperator);
|
return CreateFilterExpression(propertyExpresion, valueExpresion, filterOperator);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Expression CreateFilterExpression(
|
private static Expression CreateFilterExpression(MemberExpression memberExpression, ConstantExpression constantExpression, FilterOperatorEnum filterOperator)
|
||||||
MemberExpression memberExpression,
|
|
||||||
ConstantExpression constantExpression,
|
|
||||||
FilterOperatorEnum filterOperator)
|
|
||||||
{
|
{
|
||||||
return filterOperator switch
|
return filterOperator switch
|
||||||
{
|
{
|
||||||
@ -177,15 +156,12 @@ public static class SqlSugarExtension
|
|||||||
|
|
||||||
private static string GetStringFromJsonElement(object value)
|
private static string GetStringFromJsonElement(object value)
|
||||||
{
|
{
|
||||||
if (value is JsonElement) return ((JsonElement)value).GetString()!;
|
if (value is JsonElement element) return element.GetString()!;
|
||||||
if (value is string) return (string)value;
|
if (value is string v) return v;
|
||||||
return value?.ToString();
|
return value?.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ConstantExpression GeValuetExpression(
|
private static ConstantExpression GeValuetExpression(string field, object? value, Type propertyType)
|
||||||
string field,
|
|
||||||
object? value,
|
|
||||||
Type propertyType)
|
|
||||||
{
|
{
|
||||||
if (value == null) return Expression.Constant(null, propertyType);
|
if (value == null) return Expression.Constant(null, propertyType);
|
||||||
|
|
||||||
@ -234,13 +210,10 @@ public static class SqlSugarExtension
|
|||||||
private static dynamic? ChangeType(object value, Type conversion)
|
private static dynamic? ChangeType(object value, Type conversion)
|
||||||
{
|
{
|
||||||
var t = conversion;
|
var t = conversion;
|
||||||
|
|
||||||
if (t.IsGenericType && t.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
|
if (t.IsGenericType && t.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
|
||||||
{
|
{
|
||||||
if (value == null)
|
if (value == null)
|
||||||
{
|
|
||||||
return null;
|
return null;
|
||||||
}
|
|
||||||
|
|
||||||
t = Nullable.GetUnderlyingType(t);
|
t = Nullable.GetUnderlyingType(t);
|
||||||
}
|
}
|
||||||
@ -248,9 +221,7 @@ public static class SqlSugarExtension
|
|||||||
return Convert.ChangeType(value, t!);
|
return Convert.ChangeType(value, t!);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static MemberExpression GetPropertyExpression(
|
private static MemberExpression GetPropertyExpression(string propertyName, ParameterExpression parameter)
|
||||||
string propertyName,
|
|
||||||
ParameterExpression parameter)
|
|
||||||
{
|
{
|
||||||
Expression propertyExpression = parameter;
|
Expression propertyExpression = parameter;
|
||||||
foreach (string member in propertyName.Split('.'))
|
foreach (string member in propertyName.Split('.'))
|
||||||
@ -261,33 +232,24 @@ public static class SqlSugarExtension
|
|||||||
return (MemberExpression)propertyExpression;
|
return (MemberExpression)propertyExpression;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Expression AddSearchPropertyByKeyword<T>(
|
private static Expression AddSearchPropertyByKeyword<T>(Expression propertyExpr, string keyword, FilterOperatorEnum operatorSearch = FilterOperatorEnum.Contains)
|
||||||
Expression propertyExpr,
|
|
||||||
string keyword,
|
|
||||||
FilterOperatorEnum operatorSearch = FilterOperatorEnum.Contains)
|
|
||||||
{
|
{
|
||||||
if (propertyExpr is not MemberExpression memberExpr || memberExpr.Member is not PropertyInfo property)
|
if (propertyExpr is not MemberExpression memberExpr || memberExpr.Member is not PropertyInfo property)
|
||||||
{
|
|
||||||
throw new ArgumentException("propertyExpr must be a property expression.", nameof(propertyExpr));
|
throw new ArgumentException("propertyExpr must be a property expression.", nameof(propertyExpr));
|
||||||
}
|
|
||||||
|
|
||||||
ConstantExpression constant = Expression.Constant(keyword);
|
ConstantExpression constant = Expression.Constant(keyword);
|
||||||
|
|
||||||
MethodInfo method = operatorSearch switch
|
MethodInfo method = operatorSearch switch
|
||||||
{
|
{
|
||||||
FilterOperatorEnum.Contains => typeof(string).GetMethod(nameof(FilterOperatorEnum.Contains), new Type[] { typeof(string) }),
|
FilterOperatorEnum.Contains => typeof(string).GetMethod(nameof(FilterOperatorEnum.Contains), [typeof(string)]),
|
||||||
FilterOperatorEnum.StartsWith => typeof(string).GetMethod(nameof(FilterOperatorEnum.StartsWith), new Type[] { typeof(string) }),
|
FilterOperatorEnum.StartsWith => typeof(string).GetMethod(nameof(FilterOperatorEnum.StartsWith), [typeof(string)]),
|
||||||
FilterOperatorEnum.EndsWith => typeof(string).GetMethod(nameof(FilterOperatorEnum.EndsWith), new Type[] { typeof(string) }),
|
FilterOperatorEnum.EndsWith => typeof(string).GetMethod(nameof(FilterOperatorEnum.EndsWith), [typeof(string)]),
|
||||||
_ => throw new ArgumentException("Filter Operator is not valid."),
|
_ => throw new ArgumentException("Filter Operator is not valid."),
|
||||||
};
|
};
|
||||||
|
|
||||||
Expression selectorExpr =
|
Expression selectorExpr = property.PropertyType == typeof(string)
|
||||||
property.PropertyType == typeof(string)
|
? propertyExpr
|
||||||
? propertyExpr
|
: Expression.Condition(Expression.Equal(Expression.Convert(propertyExpr, typeof(object)), Expression.Constant(null, typeof(object))), Expression.Constant(null, typeof(string)), Expression.Call(propertyExpr, "ToString", null, null));
|
||||||
: Expression.Condition(
|
|
||||||
Expression.Equal(Expression.Convert(propertyExpr, typeof(object)), Expression.Constant(null, typeof(object))),
|
|
||||||
Expression.Constant(null, typeof(string)),
|
|
||||||
Expression.Call(propertyExpr, "ToString", null, null));
|
|
||||||
|
|
||||||
return Expression.Call(selectorExpr, method, constant);
|
return Expression.Call(selectorExpr, method, constant);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -66,7 +66,7 @@ public static class YitIdHelperExtension
|
|||||||
var tempWorkIds = _workIds;
|
var tempWorkIds = _workIds;
|
||||||
foreach (var key in keys)
|
foreach (var key in keys)
|
||||||
{
|
{
|
||||||
var tempWorkId = key[key.LastIndexOf(":", StringComparison.Ordinal)..];
|
var tempWorkId = key[key.LastIndexOf(':')..];
|
||||||
tempWorkIds.Remove(tempWorkId);
|
tempWorkIds.Remove(tempWorkId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -12,14 +12,13 @@ namespace Admin.NET.Core;
|
|||||||
public class DatabaseLoggingWriter : IDatabaseLoggingWriter, IDisposable
|
public class DatabaseLoggingWriter : IDatabaseLoggingWriter, IDisposable
|
||||||
{
|
{
|
||||||
private readonly IServiceScope _serviceScope;
|
private readonly IServiceScope _serviceScope;
|
||||||
private readonly ISqlSugarClient _db;
|
private readonly SqlSugarScopeProvider _db;
|
||||||
private readonly SysConfigService _sysConfigService; // 参数配置服务
|
private readonly SysConfigService _sysConfigService; // 参数配置服务
|
||||||
private readonly ILogger<DatabaseLoggingWriter> _logger; // 日志组件
|
private readonly ILogger<DatabaseLoggingWriter> _logger; // 日志组件
|
||||||
|
|
||||||
public DatabaseLoggingWriter(IServiceScopeFactory scopeFactory)
|
public DatabaseLoggingWriter(IServiceScopeFactory scopeFactory)
|
||||||
{
|
{
|
||||||
_serviceScope = scopeFactory.CreateScope();
|
_serviceScope = scopeFactory.CreateScope();
|
||||||
//_db = _serviceScope.ServiceProvider.GetRequiredService<ISqlSugarClient>();
|
|
||||||
_sysConfigService = _serviceScope.ServiceProvider.GetRequiredService<SysConfigService>();
|
_sysConfigService = _serviceScope.ServiceProvider.GetRequiredService<SysConfigService>();
|
||||||
_logger = _serviceScope.ServiceProvider.GetRequiredService<ILogger<DatabaseLoggingWriter>>();
|
_logger = _serviceScope.ServiceProvider.GetRequiredService<ILogger<DatabaseLoggingWriter>>();
|
||||||
|
|
||||||
|
|||||||
@ -17,8 +17,8 @@ public class SysConfigSeedData : ISqlSugarEntitySeedData<SysConfig>
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public IEnumerable<SysConfig> HasData()
|
public IEnumerable<SysConfig> HasData()
|
||||||
{
|
{
|
||||||
return new[]
|
return
|
||||||
{
|
[
|
||||||
new SysConfig{ Id=1300000000101, Name="演示环境", Code=ConfigConst.SysDemoEnv, Value="False", SysFlag=YesNoEnum.Y, Remark="演示环境", OrderNo=10, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
new SysConfig{ Id=1300000000101, Name="演示环境", Code=ConfigConst.SysDemoEnv, Value="False", SysFlag=YesNoEnum.Y, Remark="演示环境", OrderNo=10, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
||||||
new SysConfig{ Id=1300000000111, Name="默认密码", Code=ConfigConst.SysPassword, Value="Admin.NET++010101", SysFlag=YesNoEnum.Y, Remark="默认密码", OrderNo=20, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
new SysConfig{ Id=1300000000111, Name="默认密码", Code=ConfigConst.SysPassword, Value="Admin.NET++010101", SysFlag=YesNoEnum.Y, Remark="默认密码", OrderNo=20, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
||||||
new SysConfig{ Id=1300000000121, Name="密码最大错误次数", Code=ConfigConst.SysPasswordMaxErrorTimes, Value="5", SysFlag=YesNoEnum.Y, Remark="允许密码最大输入错误次数", OrderNo=30, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
new SysConfig{ Id=1300000000121, Name="密码最大错误次数", Code=ConfigConst.SysPasswordMaxErrorTimes, Value="5", SysFlag=YesNoEnum.Y, Remark="允许密码最大输入错误次数", OrderNo=30, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
||||||
@ -51,6 +51,6 @@ public class SysConfigSeedData : ISqlSugarEntitySeedData<SysConfig>
|
|||||||
new SysConfig{ Id=1310000000351, Name="系统图标", Code=ConfigConst.SysWebLogo, Value="/upload/logo.png", SysFlag=YesNoEnum.Y, Remark="系统图标", OrderNo=350, GroupCode=ConfigConst.SysWebConfigGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
new SysConfig{ Id=1310000000351, Name="系统图标", Code=ConfigConst.SysWebLogo, Value="/upload/logo.png", SysFlag=YesNoEnum.Y, Remark="系统图标", OrderNo=350, GroupCode=ConfigConst.SysWebConfigGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
||||||
new SysConfig{ Id=1310000000361, Name="ICP备案号", Code=ConfigConst.SysWebIcp, Value="省ICP备12345678号", SysFlag=YesNoEnum.Y, Remark="ICP备案号", OrderNo=360, GroupCode=ConfigConst.SysWebConfigGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
new SysConfig{ Id=1310000000361, Name="ICP备案号", Code=ConfigConst.SysWebIcp, Value="省ICP备12345678号", SysFlag=YesNoEnum.Y, Remark="ICP备案号", OrderNo=360, GroupCode=ConfigConst.SysWebConfigGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
||||||
new SysConfig{ Id=1310000000371, Name="ICP地址", Code=ConfigConst.SysWebIcpUrl, Value="https://beian.miit.gov.cn", SysFlag=YesNoEnum.Y, Remark="ICP地址", OrderNo=370, GroupCode=ConfigConst.SysWebConfigGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
new SysConfig{ Id=1310000000371, Name="ICP地址", Code=ConfigConst.SysWebIcpUrl, Value="https://beian.miit.gov.cn", SysFlag=YesNoEnum.Y, Remark="ICP地址", OrderNo=370, GroupCode=ConfigConst.SysWebConfigGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
||||||
};
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -17,8 +17,8 @@ public class SysDictDataSeedData : ISqlSugarEntitySeedData<SysDictData>
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public IEnumerable<SysDictData> HasData()
|
public IEnumerable<SysDictData> HasData()
|
||||||
{
|
{
|
||||||
return new[]
|
return
|
||||||
{
|
[
|
||||||
new SysDictData{ Id=1300000000101, DictTypeId=1300000000101, Value="输入框", Code="Input", OrderNo=100, Remark="输入框", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
new SysDictData{ Id=1300000000101, DictTypeId=1300000000101, Value="输入框", Code="Input", OrderNo=100, Remark="输入框", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
||||||
new SysDictData{ Id=1300000000102, DictTypeId=1300000000101, Value="字典选择器", Code="DictSelector", OrderNo=100, Remark="字典选择器", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
new SysDictData{ Id=1300000000102, DictTypeId=1300000000101, Value="字典选择器", Code="DictSelector", OrderNo=100, Remark="字典选择器", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
||||||
new SysDictData{ Id=1300000000103, DictTypeId=1300000000101, Value="常量选择器", Code="ConstSelector", OrderNo=100, Remark="常量选择器", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
new SysDictData{ Id=1300000000103, DictTypeId=1300000000101, Value="常量选择器", Code="ConstSelector", OrderNo=100, Remark="常量选择器", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
||||||
@ -74,6 +74,6 @@ public class SysDictDataSeedData : ISqlSugarEntitySeedData<SysDictData>
|
|||||||
new SysDictData{ Id=1300000000703, DictTypeId=1300000000201, Value="部门", Code="301", OrderNo=102, Remark="部门", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-02-10 00:00:00") },
|
new SysDictData{ Id=1300000000703, DictTypeId=1300000000201, Value="部门", Code="301", OrderNo=102, Remark="部门", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-02-10 00:00:00") },
|
||||||
new SysDictData{ Id=1300000000704, DictTypeId=1300000000201, Value="区域", Code="401", OrderNo=103, Remark="区域", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-02-10 00:00:00") },
|
new SysDictData{ Id=1300000000704, DictTypeId=1300000000201, Value="区域", Code="401", OrderNo=103, Remark="区域", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-02-10 00:00:00") },
|
||||||
new SysDictData{ Id=1300000000705, DictTypeId=1300000000201, Value="组", Code="501", OrderNo=104, Remark="组", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-02-10 00:00:00") },
|
new SysDictData{ Id=1300000000705, DictTypeId=1300000000201, Value="组", Code="501", OrderNo=104, Remark="组", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-02-10 00:00:00") },
|
||||||
};
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -17,8 +17,8 @@ public class SysDictTypeSeedData : ISqlSugarEntitySeedData<SysDictType>
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public IEnumerable<SysDictType> HasData()
|
public IEnumerable<SysDictType> HasData()
|
||||||
{
|
{
|
||||||
return new[]
|
return
|
||||||
{
|
[
|
||||||
new SysDictType{ Id=1300000000101, Name="代码生成控件类型", Code="code_gen_effect_type", OrderNo=100, Remark="代码生成控件类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
new SysDictType{ Id=1300000000101, Name="代码生成控件类型", Code="code_gen_effect_type", OrderNo=100, Remark="代码生成控件类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
||||||
new SysDictType{ Id=1300000000102, Name="代码生成查询类型", Code="code_gen_query_type", OrderNo=101, Remark="代码生成查询类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
new SysDictType{ Id=1300000000102, Name="代码生成查询类型", Code="code_gen_query_type", OrderNo=101, Remark="代码生成查询类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
||||||
new SysDictType{ Id=1300000000103, Name="代码生成.NET类型", Code="code_gen_net_type", OrderNo=102, Remark="代码生成.NET类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
new SysDictType{ Id=1300000000103, Name="代码生成.NET类型", Code="code_gen_net_type", OrderNo=102, Remark="代码生成.NET类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
||||||
@ -26,6 +26,6 @@ public class SysDictTypeSeedData : ISqlSugarEntitySeedData<SysDictType>
|
|||||||
new SysDictType{ Id=1300000000105, Name="代码生成基类", Code="code_gen_base_class", OrderNo=104, Remark="代码生成基类", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
new SysDictType{ Id=1300000000105, Name="代码生成基类", Code="code_gen_base_class", OrderNo=104, Remark="代码生成基类", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
|
||||||
new SysDictType{ Id=1300000000106, Name="代码生成打印类型", Code="code_gen_print_type", OrderNo=105, Remark="代码生成打印类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-12-04 00:00:00") },
|
new SysDictType{ Id=1300000000106, Name="代码生成打印类型", Code="code_gen_print_type", OrderNo=105, Remark="代码生成打印类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-12-04 00:00:00") },
|
||||||
new SysDictType{ Id=1300000000201, Name="机构类型", Code="org_type", OrderNo=201, Remark="机构类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-02-10 00:00:00") },
|
new SysDictType{ Id=1300000000201, Name="机构类型", Code="org_type", OrderNo=201, Remark="机构类型", Status=StatusEnum.Enable, CreateTime=DateTime.Parse("2023-02-10 00:00:00") },
|
||||||
};
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -17,8 +17,8 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public IEnumerable<SysMenu> HasData()
|
public IEnumerable<SysMenu> HasData()
|
||||||
{
|
{
|
||||||
return new[]
|
return
|
||||||
{
|
[
|
||||||
new SysMenu{ Id=1300000000101, Pid=0, Title="工作台", Path="/dashboard", Name="dashboard", Component="Layout", Icon="ele-HomeFilled", Type=MenuTypeEnum.Dir, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=0 },
|
new SysMenu{ Id=1300000000101, Pid=0, Title="工作台", Path="/dashboard", Name="dashboard", Component="Layout", Icon="ele-HomeFilled", Type=MenuTypeEnum.Dir, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=0 },
|
||||||
new SysMenu{ Id=1300000000111, Pid=1300000000101, Title="工作台", Path="/dashboard/home", Name="home", Component="/home/index", IsAffix=true, Icon="ele-HomeFilled", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
|
new SysMenu{ Id=1300000000111, Pid=1300000000101, Title="工作台", Path="/dashboard/home", Name="home", Component="/home/index", IsAffix=true, Icon="ele-HomeFilled", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
|
||||||
new SysMenu{ Id=1300000000121, Pid=1300000000101, Title="站内信", Path="/dashboard/notice", Name="notice", Component="/home/notice/index", Icon="ele-Bell", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=101 },
|
new SysMenu{ Id=1300000000121, Pid=1300000000101, Title="站内信", Path="/dashboard/notice", Name="notice", Component="/home/notice/index", Icon="ele-Bell", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=101 },
|
||||||
@ -217,6 +217,6 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
|
|||||||
new SysMenu{ Id=1310000000714, Pid=1310000000701, Title="SqlSugar", Path="/doc/SqlSugar", Name="sysSqlSugar", Component="layout/routerView/link", IsIframe=false, IsKeepAlive=false, OutLink="https://www.donet5.com/Home/Doc", Icon="ele-Coin", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=130 },
|
new SysMenu{ Id=1310000000714, Pid=1310000000701, Title="SqlSugar", Path="/doc/SqlSugar", Name="sysSqlSugar", Component="layout/routerView/link", IsIframe=false, IsKeepAlive=false, OutLink="https://www.donet5.com/Home/Doc", Icon="ele-Coin", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=130 },
|
||||||
|
|
||||||
new SysMenu{ Id=1310000000801, Pid=0, Title="关于项目", Path="/about", Name="about", Component="/about/index", Icon="ele-InfoFilled", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2023-03-12 00:00:00"), OrderNo=15000 },
|
new SysMenu{ Id=1310000000801, Pid=0, Title="关于项目", Path="/about", Name="about", Component="/about/index", Icon="ele-InfoFilled", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2023-03-12 00:00:00"), OrderNo=15000 },
|
||||||
};
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -193,7 +193,7 @@ public class APIJSONService : IDynamicApiController, ITransient
|
|||||||
parameters.Add(new SugarParameter($"@{f.Key}", FuncList.TransJObjectToSugarPara(f.Value)));
|
parameters.Add(new SugarParameter($"@{f.Key}", FuncList.TransJObjectToSugarPara(f.Value)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!parameters.Any())
|
if (parameters.Count == 0)
|
||||||
throw Oops.Bah("请输入删除条件");
|
throw Oops.Bah("请输入删除条件");
|
||||||
|
|
||||||
var whereSql = sb.ToString().TrimEnd(" and ");
|
var whereSql = sb.ToString().TrimEnd(" and ");
|
||||||
|
|||||||
@ -95,7 +95,7 @@ public class SelectTable : ISingleton
|
|||||||
}
|
}
|
||||||
else // 列表
|
else // 列表
|
||||||
{
|
{
|
||||||
IList l = tb.ToList();
|
var l = tb.ToList();
|
||||||
return query == 0 ? new Tuple<dynamic, int>(l, 0) : new Tuple<dynamic, int>(l, l.Count);
|
return query == 0 ? new Tuple<dynamic, int>(l, 0) : new Tuple<dynamic, int>(l, l.Count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -248,8 +248,8 @@ public class SelectTable : ISingleton
|
|||||||
{
|
{
|
||||||
if (item.Value.IsNullOrEmpty())
|
if (item.Value.IsNullOrEmpty())
|
||||||
{
|
{
|
||||||
var func = item.Value.ToString().Substring(0, item.Value.ToString().IndexOf("("));
|
var func = item.Value.ToString()[..item.Value.ToString().IndexOf('(')];
|
||||||
var param = item.Value.ToString().Substring(item.Value.ToString().IndexOf("(") + 1).TrimEnd(')');
|
var param = item.Value.ToString()[(item.Value.ToString().IndexOf('(') + 1)..].TrimEnd(')');
|
||||||
var types = new List<Type>();
|
var types = new List<Type>();
|
||||||
var paramss = new List<object>();
|
var paramss = new List<object>();
|
||||||
foreach (var va in param.Split(','))
|
foreach (var va in param.Split(','))
|
||||||
@ -257,7 +257,7 @@ public class SelectTable : ISingleton
|
|||||||
types.Add(typeof(object));
|
types.Add(typeof(object));
|
||||||
paramss.Add(tb.Where(it => it.Key.Equals(va)).Select(i => i.Value));
|
paramss.Add(tb.Where(it => it.Key.Equals(va)).Select(i => i.Value));
|
||||||
}
|
}
|
||||||
dic[item.Name] = ExecFunc(func, paramss.ToArray(), types.ToArray());
|
dic[item.Name] = ExecFunc(func, [.. paramss], [.. types]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return tb;
|
return tb;
|
||||||
@ -335,7 +335,7 @@ public class SelectTable : ISingleton
|
|||||||
var query = jb["query"] == null ? 2 : int.Parse(jb["query"].ToString()); // 默认输出数据和数量
|
var query = jb["query"] == null ? 2 : int.Parse(jb["query"].ToString()); // 默认输出数据和数量
|
||||||
jb.Remove("page"); jb.Remove("count"); jb.Remove("query");
|
jb.Remove("page"); jb.Remove("count"); jb.Remove("query");
|
||||||
var htt = new JArray();
|
var htt = new JArray();
|
||||||
List<string> tables = new List<string>(), where = new List<string>();
|
List<string> tables = [], where = [];
|
||||||
foreach (var t in jb)
|
foreach (var t in jb)
|
||||||
{
|
{
|
||||||
tables.Add(t.Key); where.Add(t.Value.ToString());
|
tables.Add(t.Key); where.Add(t.Value.ToString());
|
||||||
@ -410,7 +410,7 @@ public class SelectTable : ISingleton
|
|||||||
types.Add(typeof(object));
|
types.Add(typeof(object));
|
||||||
param.Add(va);
|
param.Add(va);
|
||||||
}
|
}
|
||||||
dataJObj.Add(f.Key, JToken.FromObject(ExecFunc(f.Key, param.ToArray(), types.ToArray())));
|
dataJObj.Add(f.Key, JToken.FromObject(ExecFunc(f.Key, [.. param], [.. types])));
|
||||||
}
|
}
|
||||||
resultObj.Add("func", dataJObj);
|
resultObj.Add("func", dataJObj);
|
||||||
}
|
}
|
||||||
@ -512,11 +512,11 @@ public class SelectTable : ISingleton
|
|||||||
{
|
{
|
||||||
string key = va.Key.Trim();
|
string key = va.Key.Trim();
|
||||||
string fieldValue = va.Value.ToString();
|
string fieldValue = va.Value.ToString();
|
||||||
if (key.StartsWith("@"))
|
if (key.StartsWith('@'))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (key.EndsWith("$")) // 模糊查询
|
if (key.EndsWith('$')) // 模糊查询
|
||||||
{
|
{
|
||||||
FuzzyQuery(subtable, conModels, va);
|
FuzzyQuery(subtable, conModels, va);
|
||||||
}
|
}
|
||||||
@ -524,11 +524,11 @@ public class SelectTable : ISingleton
|
|||||||
{
|
{
|
||||||
ConditionQuery(subtable, conModels, va);
|
ConditionQuery(subtable, conModels, va);
|
||||||
}
|
}
|
||||||
else if (key.EndsWith("%")) // bwtween查询
|
else if (key.EndsWith('%')) // bwtween查询
|
||||||
{
|
{
|
||||||
ConditionBetween(subtable, conModels, va, tb);
|
ConditionBetween(subtable, conModels, va, tb);
|
||||||
}
|
}
|
||||||
else if (key.EndsWith("@")) // 关联上一个table
|
else if (key.EndsWith('@')) // 关联上一个table
|
||||||
{
|
{
|
||||||
if (dd == null)
|
if (dd == null)
|
||||||
continue;
|
continue;
|
||||||
@ -541,7 +541,7 @@ public class SelectTable : ISingleton
|
|||||||
var value = lastTableRecord[str[^1]].ToString();
|
var value = lastTableRecord[str[^1]].ToString();
|
||||||
conModels.Add(new ConditionalModel() { FieldName = key.TrimEnd('@'), ConditionalType = ConditionalType.Equal, FieldValue = value });
|
conModels.Add(new ConditionalModel() { FieldName = key.TrimEnd('@'), ConditionalType = ConditionalType.Equal, FieldValue = value });
|
||||||
}
|
}
|
||||||
else if (key.EndsWith("~")) // 不等于(应该是正则匹配)
|
else if (key.EndsWith('~')) // 不等于(应该是正则匹配)
|
||||||
{
|
{
|
||||||
//conModels.Add(new ConditionalModel() { FieldName = key.TrimEnd('~'), ConditionalType = ConditionalType.NoEqual, FieldValue = fieldValue });
|
//conModels.Add(new ConditionalModel() { FieldName = key.TrimEnd('~'), ConditionalType = ConditionalType.NoEqual, FieldValue = fieldValue });
|
||||||
}
|
}
|
||||||
@ -550,7 +550,7 @@ public class SelectTable : ISingleton
|
|||||||
ConditionEqual(subtable, conModels, va);
|
ConditionEqual(subtable, conModels, va);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (conModels.Any())
|
if (conModels.Count != 0)
|
||||||
tb.Where(conModels);
|
tb.Where(conModels);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -576,39 +576,39 @@ public class SelectTable : ISingleton
|
|||||||
var model = new ConditionalModel();
|
var model = new ConditionalModel();
|
||||||
if (and.Contains(">="))
|
if (and.Contains(">="))
|
||||||
{
|
{
|
||||||
model.FieldName = and.Split(new string[] { ">=" }, StringSplitOptions.RemoveEmptyEntries)[0];
|
model.FieldName = and.Split([">="], StringSplitOptions.RemoveEmptyEntries)[0];
|
||||||
model.ConditionalType = ConditionalType.GreaterThanOrEqual;
|
model.ConditionalType = ConditionalType.GreaterThanOrEqual;
|
||||||
model.FieldValue = and.Split(new string[] { ">=" }, StringSplitOptions.RemoveEmptyEntries)[1];
|
model.FieldValue = and.Split([">="], StringSplitOptions.RemoveEmptyEntries)[1];
|
||||||
}
|
}
|
||||||
else if (and.Contains("<="))
|
else if (and.Contains("<="))
|
||||||
{
|
{
|
||||||
model.FieldName = and.Split(new string[] { "<=" }, StringSplitOptions.RemoveEmptyEntries)[0];
|
model.FieldName = and.Split(["<="], StringSplitOptions.RemoveEmptyEntries)[0];
|
||||||
model.ConditionalType = ConditionalType.LessThanOrEqual;
|
model.ConditionalType = ConditionalType.LessThanOrEqual;
|
||||||
model.FieldValue = and.Split(new string[] { "<=" }, StringSplitOptions.RemoveEmptyEntries)[1];
|
model.FieldValue = and.Split(["<="], StringSplitOptions.RemoveEmptyEntries)[1];
|
||||||
}
|
}
|
||||||
else if (and.Contains('>'))
|
else if (and.Contains('>'))
|
||||||
{
|
{
|
||||||
model.FieldName = and.Split(new string[] { ">" }, StringSplitOptions.RemoveEmptyEntries)[0];
|
model.FieldName = and.Split([">"], StringSplitOptions.RemoveEmptyEntries)[0];
|
||||||
model.ConditionalType = ConditionalType.GreaterThan;
|
model.ConditionalType = ConditionalType.GreaterThan;
|
||||||
model.FieldValue = and.Split(new string[] { ">" }, StringSplitOptions.RemoveEmptyEntries)[1];
|
model.FieldValue = and.Split([">"], StringSplitOptions.RemoveEmptyEntries)[1];
|
||||||
}
|
}
|
||||||
else if (and.Contains('<'))
|
else if (and.Contains('<'))
|
||||||
{
|
{
|
||||||
model.FieldName = and.Split(new string[] { "<" }, StringSplitOptions.RemoveEmptyEntries)[0];
|
model.FieldName = and.Split(["<"], StringSplitOptions.RemoveEmptyEntries)[0];
|
||||||
model.ConditionalType = ConditionalType.LessThan;
|
model.ConditionalType = ConditionalType.LessThan;
|
||||||
model.FieldValue = and.Split(new string[] { "<" }, StringSplitOptions.RemoveEmptyEntries)[1];
|
model.FieldValue = and.Split(["<"], StringSplitOptions.RemoveEmptyEntries)[1];
|
||||||
}
|
}
|
||||||
else if (and.Contains("!="))
|
else if (and.Contains("!="))
|
||||||
{
|
{
|
||||||
model.FieldName = and.Split(new string[] { "!=" }, StringSplitOptions.RemoveEmptyEntries)[0];
|
model.FieldName = and.Split(["!="], StringSplitOptions.RemoveEmptyEntries)[0];
|
||||||
model.ConditionalType = ConditionalType.NoEqual;
|
model.ConditionalType = ConditionalType.NoEqual;
|
||||||
model.FieldValue = and.Split(new string[] { "!=" }, StringSplitOptions.RemoveEmptyEntries)[1];
|
model.FieldValue = and.Split(["!="], StringSplitOptions.RemoveEmptyEntries)[1];
|
||||||
}
|
}
|
||||||
else if (and.Contains('='))
|
else if (and.Contains('='))
|
||||||
{
|
{
|
||||||
model.FieldName = and.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries)[0];
|
model.FieldName = and.Split(["="], StringSplitOptions.RemoveEmptyEntries)[0];
|
||||||
model.ConditionalType = ConditionalType.Equal;
|
model.ConditionalType = ConditionalType.Equal;
|
||||||
model.FieldValue = and.Split(new string[] { "=" }, StringSplitOptions.RemoveEmptyEntries)[1];
|
model.FieldValue = and.Split(["="], StringSplitOptions.RemoveEmptyEntries)[1];
|
||||||
}
|
}
|
||||||
hw.Add(model);
|
hw.Add(model);
|
||||||
}
|
}
|
||||||
@ -634,7 +634,7 @@ public class SelectTable : ISingleton
|
|||||||
groupList.Add(new GroupByModel() { FieldName = col });
|
groupList.Add(new GroupByModel() { FieldName = col });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (groupList.Any())
|
if (groupList.Count != 0)
|
||||||
tb.GroupBy(groupList);
|
tb.GroupBy(groupList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -653,12 +653,12 @@ public class SelectTable : ISingleton
|
|||||||
orderList.Add(new OrderByModel()
|
orderList.Add(new OrderByModel()
|
||||||
{
|
{
|
||||||
FieldName = col,
|
FieldName = col,
|
||||||
OrderByType = item.EndsWith("-") || item.EndsWith(" desc") ? OrderByType.Desc : OrderByType.Asc
|
OrderByType = item.EndsWith('-') || item.EndsWith(" desc") ? OrderByType.Desc : OrderByType.Asc
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (orderList.Any())
|
if (orderList.Count != 0)
|
||||||
tb.OrderBy(orderList);
|
tb.OrderBy(orderList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -687,7 +687,7 @@ public class SelectTable : ISingleton
|
|||||||
{
|
{
|
||||||
var vakey = va.Key.Trim();
|
var vakey = va.Key.Trim();
|
||||||
var field = vakey.TrimEnd("{}".ToCharArray());
|
var field = vakey.TrimEnd("{}".ToCharArray());
|
||||||
var columnName = field.TrimEnd(new char[] { '&', '|' });
|
var columnName = field.TrimEnd(['&', '|']);
|
||||||
IsCol(subtable, columnName);
|
IsCol(subtable, columnName);
|
||||||
var ddt = new List<KeyValuePair<WhereType, ConditionalModel>>();
|
var ddt = new List<KeyValuePair<WhereType, ConditionalModel>>();
|
||||||
foreach (var and in va.Value.ToString().Split(','))
|
foreach (var and in va.Value.ToString().Split(','))
|
||||||
@ -707,18 +707,18 @@ public class SelectTable : ISingleton
|
|||||||
model.ConditionalType = ConditionalType.LessThanOrEqual;
|
model.ConditionalType = ConditionalType.LessThanOrEqual;
|
||||||
model.FieldValue = and.TrimStart("<=".ToCharArray());
|
model.FieldValue = and.TrimStart("<=".ToCharArray());
|
||||||
}
|
}
|
||||||
else if (and.StartsWith(">"))
|
else if (and.StartsWith('>'))
|
||||||
{
|
{
|
||||||
model.ConditionalType = ConditionalType.GreaterThan;
|
model.ConditionalType = ConditionalType.GreaterThan;
|
||||||
model.FieldValue = and.TrimStart('>');
|
model.FieldValue = and.TrimStart('>');
|
||||||
}
|
}
|
||||||
else if (and.StartsWith("<"))
|
else if (and.StartsWith('<'))
|
||||||
{
|
{
|
||||||
model.ConditionalType = ConditionalType.LessThan;
|
model.ConditionalType = ConditionalType.LessThan;
|
||||||
model.FieldValue = and.TrimStart('<');
|
model.FieldValue = and.TrimStart('<');
|
||||||
}
|
}
|
||||||
model.CSharpTypeName = FuncList.GetValueCSharpType(model.FieldValue);
|
model.CSharpTypeName = FuncList.GetValueCSharpType(model.FieldValue);
|
||||||
ddt.Add(new KeyValuePair<WhereType, ConditionalModel>(field.EndsWith("!") ? WhereType.Or : WhereType.And, model));
|
ddt.Add(new KeyValuePair<WhereType, ConditionalModel>(field.EndsWith('!') ? WhereType.Or : WhereType.And, model));
|
||||||
}
|
}
|
||||||
conModels.Add(new ConditionalCollections() { ConditionalList = ddt });
|
conModels.Add(new ConditionalCollections() { ConditionalList = ddt });
|
||||||
}
|
}
|
||||||
@ -776,7 +776,7 @@ public class SelectTable : ISingleton
|
|||||||
conModels.Add(new ConditionalModel()
|
conModels.Add(new ConditionalModel()
|
||||||
{
|
{
|
||||||
FieldName = key.TrimEnd('!'),
|
FieldName = key.TrimEnd('!'),
|
||||||
ConditionalType = key.EndsWith("!") ? ConditionalType.NotIn : ConditionalType.In,
|
ConditionalType = key.EndsWith('!') ? ConditionalType.NotIn : ConditionalType.In,
|
||||||
FieldValue = va.Value.ToObject<string[]>().Aggregate((a, b) => a + "," + b)
|
FieldValue = va.Value.ToObject<string[]>().Aggregate((a, b) => a + "," + b)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -785,7 +785,7 @@ public class SelectTable : ISingleton
|
|||||||
if (string.IsNullOrEmpty(fieldValue))
|
if (string.IsNullOrEmpty(fieldValue))
|
||||||
{
|
{
|
||||||
// is not null or ''
|
// is not null or ''
|
||||||
if (key.EndsWith("!"))
|
if (key.EndsWith('!'))
|
||||||
{
|
{
|
||||||
conModels.Add(new ConditionalModel() { FieldName = key.TrimEnd('!'), ConditionalType = ConditionalType.IsNot, FieldValue = null });
|
conModels.Add(new ConditionalModel() { FieldName = key.TrimEnd('!'), ConditionalType = ConditionalType.IsNot, FieldValue = null });
|
||||||
conModels.Add(new ConditionalModel() { FieldName = key.TrimEnd('!'), ConditionalType = ConditionalType.IsNot, FieldValue = "" });
|
conModels.Add(new ConditionalModel() { FieldName = key.TrimEnd('!'), ConditionalType = ConditionalType.IsNot, FieldValue = "" });
|
||||||
@ -802,7 +802,7 @@ public class SelectTable : ISingleton
|
|||||||
conModels.Add(new ConditionalModel()
|
conModels.Add(new ConditionalModel()
|
||||||
{
|
{
|
||||||
FieldName = key.TrimEnd('!'),
|
FieldName = key.TrimEnd('!'),
|
||||||
ConditionalType = key.EndsWith("!") ? ConditionalType.NoEqual : ConditionalType.Equal,
|
ConditionalType = key.EndsWith('!') ? ConditionalType.NoEqual : ConditionalType.Equal,
|
||||||
FieldValue = fieldValue
|
FieldValue = fieldValue
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -818,19 +818,19 @@ public class SelectTable : ISingleton
|
|||||||
if (IsCol(subtable, vakey.TrimEnd('$')))
|
if (IsCol(subtable, vakey.TrimEnd('$')))
|
||||||
{
|
{
|
||||||
// 支持三种like查询
|
// 支持三种like查询
|
||||||
if (fieldValue.StartsWith("%") && fieldValue.EndsWith("%"))
|
if (fieldValue.StartsWith('%') && fieldValue.EndsWith('%'))
|
||||||
{
|
{
|
||||||
conditionalType = ConditionalType.Like;
|
conditionalType = ConditionalType.Like;
|
||||||
}
|
}
|
||||||
else if (fieldValue.StartsWith("%"))
|
else if (fieldValue.StartsWith('%'))
|
||||||
{
|
{
|
||||||
conditionalType = ConditionalType.LikeRight;
|
conditionalType = ConditionalType.LikeRight;
|
||||||
}
|
}
|
||||||
else if (fieldValue.EndsWith("%"))
|
else if (fieldValue.EndsWith('%'))
|
||||||
{
|
{
|
||||||
conditionalType = ConditionalType.LikeLeft;
|
conditionalType = ConditionalType.LikeLeft;
|
||||||
}
|
}
|
||||||
conModels.Add(new ConditionalModel() { FieldName = vakey.TrimEnd('$'), ConditionalType = conditionalType, FieldValue = fieldValue.TrimEnd("%".ToArray()).TrimStart("%".ToArray()) });
|
conModels.Add(new ConditionalModel() { FieldName = vakey.TrimEnd('$'), ConditionalType = conditionalType, FieldValue = fieldValue.TrimEnd([.. "%"]).TrimStart([.. "%"]) });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -885,23 +885,23 @@ public class SelectTable : ISingleton
|
|||||||
|
|
||||||
foreach (var f in cols) // 遍历字段
|
foreach (var f in cols) // 遍历字段
|
||||||
{
|
{
|
||||||
if (//f.Key.ToLower() != "id" && //是否一定要传id
|
if (//f.Key.ToLower() != "id" && // 是否一定要传id
|
||||||
IsCol(tableName, f.Key) &&
|
IsCol(tableName, f.Key) &&
|
||||||
(role.Insert.Column.Contains("*") || role.Insert.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase)))
|
(role.Insert.Column.Contains("*") || role.Insert.Column.Contains(f.Key, StringComparer.CurrentCultureIgnoreCase)))
|
||||||
dt.Add(f.Key, FuncList.TransJObjectToSugarPara(f.Value));
|
dt.Add(f.Key, FuncList.TransJObjectToSugarPara(f.Value));
|
||||||
}
|
}
|
||||||
// 如果外部没传Id,就后端生成或使用数据库默认值,如果都没有会出错
|
// 如果外部没传Id,就后端生成或使用数据库默认值,如果都没有会出错
|
||||||
object id;
|
object id;
|
||||||
if (!dt.ContainsKey("id"))
|
if (!dt.TryGetValue("id", out object value))
|
||||||
{
|
{
|
||||||
id = YitIdHelper.NextId();//自己生成id的方法,可以由外部传入
|
id = YitIdHelper.NextId(); // 自己生成id的方法,可以由外部传入
|
||||||
dt.Add("id", id);
|
dt.Add("id", id);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
id = dt["id"];
|
id = value;
|
||||||
}
|
}
|
||||||
_db.Insertable(dt).AS(tableName).ExecuteCommand();//根据主键类型设置返回雪花或自增,目前返回条数
|
_db.Insertable(dt).AS(tableName).ExecuteCommand(); // 根据主键类型设置返回雪花或自增,目前返回条数
|
||||||
|
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
@ -922,7 +922,7 @@ public class SelectTable : ISingleton
|
|||||||
var dt = new Dictionary<string, object>();
|
var dt = new Dictionary<string, object>();
|
||||||
var sb = new StringBuilder(100);
|
var sb = new StringBuilder(100);
|
||||||
object id = null;
|
object id = null;
|
||||||
foreach (var f in record)//遍历每个字段
|
foreach (var f in record) // 遍历每个字段
|
||||||
{
|
{
|
||||||
if (f.Key.Equals("id", StringComparison.OrdinalIgnoreCase))
|
if (f.Key.Equals("id", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
|
|||||||
@ -29,8 +29,8 @@ public class AlipayErrorCode
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 错误码集
|
/// 错误码集
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static readonly List<AlipayErrorCode> StatusCodes = new()
|
private static readonly List<AlipayErrorCode> StatusCodes =
|
||||||
{
|
[
|
||||||
new AlipayErrorCode { Code="SYSTEM_ERROR", Message="系统繁忙", Solution="可能是由于网络或者系统故障,请与技术人员联系以解决该问题。" },
|
new AlipayErrorCode { Code="SYSTEM_ERROR", Message="系统繁忙", Solution="可能是由于网络或者系统故障,请与技术人员联系以解决该问题。" },
|
||||||
new AlipayErrorCode { Code="INVALID_PARAMETER", Message="参数有误或没有参数", Solution="请检查并确认查询请求参数合法性。" },
|
new AlipayErrorCode { Code="INVALID_PARAMETER", Message="参数有误或没有参数", Solution="请检查并确认查询请求参数合法性。" },
|
||||||
new AlipayErrorCode { Code="AUTHORISE_NOT_MATCH", Message="授权失败,无法获取用户信息", Solution="检查账户与支付方关系主表关系,确认是否正确配置。" },
|
new AlipayErrorCode { Code="AUTHORISE_NOT_MATCH", Message="授权失败,无法获取用户信息", Solution="检查账户与支付方关系主表关系,确认是否正确配置。" },
|
||||||
@ -129,7 +129,7 @@ public class AlipayErrorCode
|
|||||||
new AlipayErrorCode { Code="USER_AGREEMENT_VERIFY_FAIL", Message="用户协议校验失败", Solution="确认入参中协议号是否正确" },
|
new AlipayErrorCode { Code="USER_AGREEMENT_VERIFY_FAIL", Message="用户协议校验失败", Solution="确认入参中协议号是否正确" },
|
||||||
new AlipayErrorCode { Code="USER_NOT_EXIST", Message="用户不存在(仅用于WorldFirst)", Solution="用户不存在,请检查收付款方信息" },
|
new AlipayErrorCode { Code="USER_NOT_EXIST", Message="用户不存在(仅用于WorldFirst)", Solution="用户不存在,请检查收付款方信息" },
|
||||||
new AlipayErrorCode { Code="USER_RISK_FREEZE", Message="账户异常被冻结,无法付款,请咨询支付宝客服95188", Solution="账户异常被冻结,无法付款,请咨询支付宝客服95188" }
|
new AlipayErrorCode { Code="USER_RISK_FREEZE", Message="账户异常被冻结,无法付款,请咨询支付宝客服95188", Solution="账户异常被冻结,无法付款,请咨询支付宝客服95188" }
|
||||||
};
|
];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 根据错误码获取错误信息
|
/// 根据错误码获取错误信息
|
||||||
|
|||||||
@ -111,7 +111,7 @@ public class AlipayService : IDynamicApiController, ITransient
|
|||||||
[ApiDescriptionSettings(Name = "Notify"), HttpPost]
|
[ApiDescriptionSettings(Name = "Notify"), HttpPost]
|
||||||
public string Notify()
|
public string Notify()
|
||||||
{
|
{
|
||||||
SortedDictionary<string, string> sorted = new();
|
SortedDictionary<string, string> sorted = [];
|
||||||
foreach (string key in _httpContext.HttpContext!.Request.Form.Keys)
|
foreach (string key in _httpContext.HttpContext!.Request.Form.Keys)
|
||||||
sorted.Add(key, _httpContext.HttpContext.Request.Form[key]);
|
sorted.Add(key, _httpContext.HttpContext.Request.Form[key]);
|
||||||
|
|
||||||
@ -141,7 +141,7 @@ public class AlipayService : IDynamicApiController, ITransient
|
|||||||
{
|
{
|
||||||
// 约定交易码前四位为类型码,后面为订单号
|
// 约定交易码前四位为类型码,后面为订单号
|
||||||
var tradeNo = long.Parse(outTradeNo);
|
var tradeNo = long.Parse(outTradeNo);
|
||||||
var type = long.Parse(outTradeNo.Substring(0, 4));
|
var type = long.Parse(outTradeNo[..4]);
|
||||||
|
|
||||||
// 循环执行业务逻辑,若都未处理(回调全部返回false)则交易失败
|
// 循环执行业务逻辑,若都未处理(回调全部返回false)则交易失败
|
||||||
var isError = true;
|
var isError = true;
|
||||||
@ -221,26 +221,30 @@ public class AlipayService : IDynamicApiController, ITransient
|
|||||||
{
|
{
|
||||||
// 构造请求参数以调用接口
|
// 构造请求参数以调用接口
|
||||||
AlipayFundTransUniTransferRequest request = new();
|
AlipayFundTransUniTransferRequest request = new();
|
||||||
AlipayFundTransUniTransferModel model = new();
|
AlipayFundTransUniTransferModel model = new()
|
||||||
model.BizScene = AlipayConst.BizScene;
|
{
|
||||||
model.ProductCode = AlipayConst.ProductCode;
|
BizScene = AlipayConst.BizScene,
|
||||||
|
ProductCode = AlipayConst.ProductCode,
|
||||||
|
|
||||||
// 设置商家侧唯一订单号
|
// 设置商家侧唯一订单号
|
||||||
model.OutBizNo = input.OutBizNo;
|
OutBizNo = input.OutBizNo,
|
||||||
|
|
||||||
// 设置订单总金额
|
// 设置订单总金额
|
||||||
model.TransAmount = input.TransAmount.ToString();
|
TransAmount = input.TransAmount.ToString(),
|
||||||
|
|
||||||
// 设置转账业务的标题
|
// 设置转账业务的标题
|
||||||
model.OrderTitle = input.OrderTitle;
|
OrderTitle = input.OrderTitle
|
||||||
|
};
|
||||||
|
|
||||||
// 设置收款方信息
|
// 设置收款方信息
|
||||||
Participant payeeInfo = new();
|
Participant payeeInfo = new()
|
||||||
payeeInfo.CertType = input.CertType.ToString();
|
{
|
||||||
payeeInfo.CertNo = input.CertNo;
|
CertType = input.CertType.ToString(),
|
||||||
payeeInfo.Identity = input.Identity;
|
CertNo = input.CertNo,
|
||||||
payeeInfo.Name = input.Name;
|
Identity = input.Identity,
|
||||||
payeeInfo.IdentityType = input.IdentityType.ToString();
|
Name = input.Name,
|
||||||
|
IdentityType = input.IdentityType.ToString()
|
||||||
|
};
|
||||||
model.PayeeInfo = payeeInfo;
|
model.PayeeInfo = payeeInfo;
|
||||||
|
|
||||||
// 设置业务备注
|
// 设置业务备注
|
||||||
|
|||||||
@ -112,7 +112,7 @@ public class SysAuthService : IDynamicApiController, ITransient
|
|||||||
if (string.IsNullOrWhiteSpace(host) || host.StartsWith("localhost")) host = SqlSugarConst.DefaultTenantHost;
|
if (string.IsNullOrWhiteSpace(host) || host.StartsWith("localhost")) host = SqlSugarConst.DefaultTenantHost;
|
||||||
|
|
||||||
// 租户是否存在或已禁用
|
// 租户是否存在或已禁用
|
||||||
tenant = await _sysUserRep.ChangeRepository<SqlSugarRepository<SysTenant>>().GetFirstAsync(u => u.Host == host.ToLower());
|
tenant = await _sysUserRep.ChangeRepository<SqlSugarRepository<SysTenant>>().GetFirstAsync(u => u.Host.Equals(host, StringComparison.CurrentCultureIgnoreCase));
|
||||||
if (tenant?.Status != StatusEnum.Enable) throw Oops.Oh(ErrorCodeEnum.Z1003);
|
if (tenant?.Status != StatusEnum.Enable) throw Oops.Oh(ErrorCodeEnum.Z1003);
|
||||||
|
|
||||||
// 根据入参类型、租户查询登录用户
|
// 根据入参类型、租户查询登录用户
|
||||||
|
|||||||
@ -52,8 +52,8 @@ public class SysCacheService : IDynamicApiController, ISingleton
|
|||||||
public List<string> GetKeyList()
|
public List<string> GetKeyList()
|
||||||
{
|
{
|
||||||
return _cacheProvider.Cache == Cache.Default
|
return _cacheProvider.Cache == Cache.Default
|
||||||
? _cacheProvider.Cache.Keys.Where(u => u.StartsWith(_cacheOptions.Prefix)).Select(u => u[_cacheOptions.Prefix.Length..]).OrderBy(u => u).ToList()
|
? [.. _cacheProvider.Cache.Keys.Where(u => u.StartsWith(_cacheOptions.Prefix)).Select(u => u[_cacheOptions.Prefix.Length..]).OrderBy(u => u)]
|
||||||
: ((FullRedis)_cacheProvider.Cache).Search($"{_cacheOptions.Prefix}*", int.MaxValue).Select(u => u[_cacheOptions.Prefix.Length..]).OrderBy(u => u).ToList();
|
: [.. ((FullRedis)_cacheProvider.Cache).Search($"{_cacheOptions.Prefix}*", int.MaxValue).Select(u => u[_cacheOptions.Prefix.Length..]).OrderBy(u => u)];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -81,24 +81,24 @@ public class SysCacheService : IDynamicApiController, ISingleton
|
|||||||
return !string.IsNullOrWhiteSpace(key) && _cacheProvider.Cache.Set($"{_cacheOptions.Prefix}{key}", value, expire);
|
return !string.IsNullOrWhiteSpace(key) && _cacheProvider.Cache.Set($"{_cacheOptions.Prefix}{key}", value, expire);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<TR> AdGetAsync<TR>(String cacheName, Func<Task<TR>> del, TimeSpan? expiry = default(TimeSpan?)) where TR : class
|
public async Task<TR> AdGetAsync<TR>(String cacheName, Func<Task<TR>> del, TimeSpan? expiry = default) where TR : class
|
||||||
{
|
{
|
||||||
return await AdGetAsync<TR>(cacheName, del, new object[] { }, expiry);
|
return await AdGetAsync<TR>(cacheName, del, [], expiry);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<TR> AdGetAsync<TR, T1>(String cacheName, Func<T1, Task<TR>> del, T1 t1, TimeSpan? expiry = default(TimeSpan?)) where TR : class
|
public async Task<TR> AdGetAsync<TR, T1>(String cacheName, Func<T1, Task<TR>> del, T1 t1, TimeSpan? expiry = default) where TR : class
|
||||||
{
|
{
|
||||||
return await AdGetAsync<TR>(cacheName, del, new object[] { t1 }, expiry);
|
return await AdGetAsync<TR>(cacheName, del, [t1], expiry);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<TR> AdGetAsync<TR, T1, T2>(String cacheName, Func<T1, T2, Task<TR>> del, T1 t1, T2 t2, TimeSpan? expiry = default(TimeSpan?)) where TR : class
|
public async Task<TR> AdGetAsync<TR, T1, T2>(String cacheName, Func<T1, T2, Task<TR>> del, T1 t1, T2 t2, TimeSpan? expiry = default) where TR : class
|
||||||
{
|
{
|
||||||
return await AdGetAsync<TR>(cacheName, del, new object[] { t1, t2 }, expiry);
|
return await AdGetAsync<TR>(cacheName, del, [t1, t2], expiry);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<TR> AdGetAsync<TR, T1, T2, T3>(String cacheName, Func<T1, T2, T3, Task<TR>> del, T1 t1, T2 t2, T3 t3, TimeSpan? expiry = default(TimeSpan?)) where TR : class
|
public async Task<TR> AdGetAsync<TR, T1, T2, T3>(String cacheName, Func<T1, T2, T3, Task<TR>> del, T1 t1, T2 t2, T3 t3, TimeSpan? expiry = default) where TR : class
|
||||||
{
|
{
|
||||||
return await AdGetAsync<TR>(cacheName, del, new object[] { t1, t2, t3 }, expiry);
|
return await AdGetAsync<TR>(cacheName, del, [t1, t2, t3], expiry);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<T> AdGetAsync<T>(string cacheName, Delegate del, Object[] obs, TimeSpan? expiry) where T : class
|
private async Task<T> AdGetAsync<T>(string cacheName, Delegate del, Object[] obs, TimeSpan? expiry) where T : class
|
||||||
@ -116,17 +116,17 @@ public class SysCacheService : IDynamicApiController, ISingleton
|
|||||||
|
|
||||||
public T Get<T>(String cacheName, object t1)
|
public T Get<T>(String cacheName, object t1)
|
||||||
{
|
{
|
||||||
return Get<T>(cacheName, new object[] { t1 });
|
return Get<T>(cacheName, [t1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public T Get<T>(String cacheName, object t1, object t2)
|
public T Get<T>(String cacheName, object t1, object t2)
|
||||||
{
|
{
|
||||||
return Get<T>(cacheName, new object[] { t1, t2 });
|
return Get<T>(cacheName, [t1, t2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public T Get<T>(String cacheName, object t1, object t2, object t3)
|
public T Get<T>(String cacheName, object t1, object t2, object t3)
|
||||||
{
|
{
|
||||||
return Get<T>(cacheName, new object[] { t1, t2, t3 });
|
return Get<T>(cacheName, [t1, t2, t3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private T Get<T>(String cacheName, Object[] obs)
|
private T Get<T>(String cacheName, Object[] obs)
|
||||||
@ -353,7 +353,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
|
|||||||
public T HashGetOne<T>(string key, string field)
|
public T HashGetOne<T>(string key, string field)
|
||||||
{
|
{
|
||||||
var hash = GetHashMap<T>(key);
|
var hash = GetHashMap<T>(key);
|
||||||
return hash.ContainsKey(field) ? hash[field] : default(T);
|
return hash.TryGetValue(field, out T value) ? value : default;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@ -77,7 +77,7 @@ public class CustomViewEngine : ViewEngineModel
|
|||||||
var config = App.GetOptions<DbConnectionOptions>().ConnectionConfigs.FirstOrDefault(u => u.ConfigId.ToString() == ConfigId);
|
var config = App.GetOptions<DbConnectionOptions>().ConnectionConfigs.FirstOrDefault(u => u.ConfigId.ToString() == ConfigId);
|
||||||
ColumnList = GetColumnListByTableName(tbName.ToString());
|
ColumnList = GetColumnListByTableName(tbName.ToString());
|
||||||
var col = ColumnList.Where(c => (config.DbSettings.EnableUnderLine
|
var col = ColumnList.Where(c => (config.DbSettings.EnableUnderLine
|
||||||
? CodeGenUtil.CamelColumnName(c.ColumnName, Array.Empty<string>())
|
? CodeGenUtil.CamelColumnName(c.ColumnName, [])
|
||||||
: c.ColumnName) == colName.ToString()).FirstOrDefault();
|
: c.ColumnName) == colName.ToString()).FirstOrDefault();
|
||||||
return col.NetType;
|
return col.NetType;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -123,10 +123,10 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
|
|||||||
|
|
||||||
#region 添加校验规则
|
#region 添加校验规则
|
||||||
|
|
||||||
//添加校验规则
|
// 添加校验规则
|
||||||
codeGenConfig.Id = YitIdHelper.NextId();
|
codeGenConfig.Id = YitIdHelper.NextId();
|
||||||
//验证规则
|
// 验证规则
|
||||||
List<VerifyRuleItem> ruleItems = new List<VerifyRuleItem>();
|
List<VerifyRuleItem> ruleItems = [];
|
||||||
if (!tableColumn.IsNullable && !tableColumn.IsPrimarykey)
|
if (!tableColumn.IsNullable && !tableColumn.IsPrimarykey)
|
||||||
{
|
{
|
||||||
ruleItems.Add(new VerifyRuleItem()
|
ruleItems.Add(new VerifyRuleItem()
|
||||||
@ -184,7 +184,6 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
|
|||||||
private static string? GetDefaultValue(string dataValue)
|
private static string? GetDefaultValue(string dataValue)
|
||||||
{
|
{
|
||||||
if (dataValue == null) return null;
|
if (dataValue == null) return null;
|
||||||
string value = "";
|
|
||||||
// 正则表达式模式
|
// 正则表达式模式
|
||||||
// \( 和 \) 用来匹配字面量的括号
|
// \( 和 \) 用来匹配字面量的括号
|
||||||
// .+ 用来匹配一个或多个任意字符,但不包括换行符
|
// .+ 用来匹配一个或多个任意字符,但不包括换行符
|
||||||
@ -193,6 +192,7 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
|
|||||||
// 使用 Regex 类进行匹配
|
// 使用 Regex 类进行匹配
|
||||||
Match match = Regex.Match(dataValue, pattern);
|
Match match = Regex.Match(dataValue, pattern);
|
||||||
|
|
||||||
|
string value;
|
||||||
// 如果找到了匹配项
|
// 如果找到了匹配项
|
||||||
if (match.Success)
|
if (match.Success)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -39,5 +39,5 @@ public class ApiOutput
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 接口列表
|
/// 接口列表
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public List<ApiOutput> Children { get; set; } = new List<ApiOutput>();
|
public List<ApiOutput> Children { get; set; } = [];
|
||||||
}
|
}
|
||||||
@ -63,7 +63,7 @@ public class ExportProcInput2 : BaseProcInput
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ProcExporterHeaderFilter : IExporterHeaderFilter
|
public class ProcExporterHeaderFilter : IExporterHeaderFilter
|
||||||
{
|
{
|
||||||
private Dictionary<string, Tuple<string, int>> _includeHeader;
|
private readonly Dictionary<string, Tuple<string, int>> _includeHeader;
|
||||||
|
|
||||||
public ProcExporterHeaderFilter(Dictionary<string, Tuple<string, int>> includeHeader)
|
public ProcExporterHeaderFilter(Dictionary<string, Tuple<string, int>> includeHeader)
|
||||||
{
|
{
|
||||||
@ -75,9 +75,9 @@ public class ProcExporterHeaderFilter : IExporterHeaderFilter
|
|||||||
if (_includeHeader != null && _includeHeader.Count > 0)
|
if (_includeHeader != null && _includeHeader.Count > 0)
|
||||||
{
|
{
|
||||||
var key = exporterHeaderInfo.PropertyName.ToUpper();
|
var key = exporterHeaderInfo.PropertyName.ToUpper();
|
||||||
if (_includeHeader.ContainsKey(key))
|
if (_includeHeader.TryGetValue(key, out Tuple<string, int> value))
|
||||||
{
|
{
|
||||||
exporterHeaderInfo.DisplayName = _includeHeader[key].Item1;
|
exporterHeaderInfo.DisplayName = value.Item1;
|
||||||
return exporterHeaderInfo;
|
return exporterHeaderInfo;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@ -18,13 +18,10 @@ namespace Admin.NET.Core.Service;
|
|||||||
public class SysCommonService : IDynamicApiController, ITransient
|
public class SysCommonService : IDynamicApiController, ITransient
|
||||||
{
|
{
|
||||||
private readonly IApiDescriptionGroupCollectionProvider _apiProvider;
|
private readonly IApiDescriptionGroupCollectionProvider _apiProvider;
|
||||||
private readonly UserManager _userManager;
|
|
||||||
|
|
||||||
public SysCommonService(IApiDescriptionGroupCollectionProvider apiProvider,
|
public SysCommonService(IApiDescriptionGroupCollectionProvider apiProvider)
|
||||||
UserManager userManager)
|
|
||||||
{
|
{
|
||||||
_apiProvider = apiProvider;
|
_apiProvider = apiProvider;
|
||||||
_userManager = userManager;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -109,8 +106,7 @@ public class SysCommonService : IDynamicApiController, ITransient
|
|||||||
route = route[(route.IndexOf('/') + 1)..]; // 去掉路由前缀
|
route = route[(route.IndexOf('/') + 1)..]; // 去掉路由前缀
|
||||||
|
|
||||||
// 接口分组/控制器信息
|
// 接口分组/控制器信息
|
||||||
var controllerActionDescriptor = action.ActionDescriptor as ControllerActionDescriptor;
|
if (action.ActionDescriptor is not ControllerActionDescriptor controllerActionDescriptor)
|
||||||
if (controllerActionDescriptor == null)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// 是否只获取所有的移动端/AppApi接口
|
// 是否只获取所有的移动端/AppApi接口
|
||||||
@ -150,7 +146,7 @@ public class SysCommonService : IDynamicApiController, ITransient
|
|||||||
});
|
});
|
||||||
|
|
||||||
// 接口分组/控制器排序
|
// 接口分组/控制器排序
|
||||||
apiOuput.Children = apiOuput.Children.OrderByDescending(u => u.Order).ToList();
|
apiOuput.Children = [.. apiOuput.Children.OrderByDescending(u => u.Order)];
|
||||||
}
|
}
|
||||||
|
|
||||||
apiList.Add(apiOuput);
|
apiList.Add(apiOuput);
|
||||||
@ -169,8 +165,7 @@ public class SysCommonService : IDynamicApiController, ITransient
|
|||||||
var apiList = sysCacheService.Get<List<string>>(CacheConst.KeyAppApi);
|
var apiList = sysCacheService.Get<List<string>>(CacheConst.KeyAppApi);
|
||||||
if (apiList == null)
|
if (apiList == null)
|
||||||
{
|
{
|
||||||
apiList = new List<string>();
|
apiList = [];
|
||||||
|
|
||||||
var allApiList = GetApiList("", true);
|
var allApiList = GetApiList("", true);
|
||||||
foreach (var apiOutput in allApiList)
|
foreach (var apiOutput in allApiList)
|
||||||
{
|
{
|
||||||
@ -190,9 +185,7 @@ public class SysCommonService : IDynamicApiController, ITransient
|
|||||||
public async Task<IActionResult> DownloadErrorExcelTemp([FromQuery] string fileName = null)
|
public async Task<IActionResult> DownloadErrorExcelTemp([FromQuery] string fileName = null)
|
||||||
{
|
{
|
||||||
var userId = App.User?.FindFirst(ClaimConst.UserId)?.Value;
|
var userId = App.User?.FindFirst(ClaimConst.UserId)?.Value;
|
||||||
var resultStream = App.GetRequiredService<SysCacheService>().Get<MemoryStream>(CacheConst.KeyExcelTemp + userId);
|
var resultStream = App.GetRequiredService<SysCacheService>().Get<MemoryStream>(CacheConst.KeyExcelTemp + userId) ?? throw Oops.Oh("错误标记文件已过期。");
|
||||||
|
|
||||||
if (resultStream == null) throw Oops.Oh("错误标记文件已过期。");
|
|
||||||
|
|
||||||
return await Task.FromResult(new FileStreamResult(resultStream, "application/octet-stream")
|
return await Task.FromResult(new FileStreamResult(resultStream, "application/octet-stream")
|
||||||
{
|
{
|
||||||
|
|||||||
@ -178,7 +178,7 @@ public class SysFileService : IDynamicApiController, ITransient
|
|||||||
if (App.Configuration["SSHProvider:Enabled"].ToBoolean())
|
if (App.Configuration["SSHProvider:Enabled"].ToBoolean())
|
||||||
{
|
{
|
||||||
var sysFile = await _sysFileRep.CopyNew().GetFirstAsync(u => u.Url == url) ?? throw Oops.Oh($"文件不存在");
|
var sysFile = await _sysFileRep.CopyNew().GetFirstAsync(u => u.Url == url) ?? throw Oops.Oh($"文件不存在");
|
||||||
using SSHHelper helper = new SSHHelper(App.Configuration["SSHProvider:Host"],
|
using SSHHelper helper = new(App.Configuration["SSHProvider:Host"],
|
||||||
App.Configuration["SSHProvider:Port"].ToInt(), App.Configuration["SSHProvider:Username"], App.Configuration["SSHProvider:Password"]);
|
App.Configuration["SSHProvider:Port"].ToInt(), App.Configuration["SSHProvider:Username"], App.Configuration["SSHProvider:Password"]);
|
||||||
return Convert.ToBase64String(helper.ReadAllBytes(sysFile.FilePath));
|
return Convert.ToBase64String(helper.ReadAllBytes(sysFile.FilePath));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -79,8 +79,7 @@ public class SysLogExService : IDynamicApiController, ITransient
|
|||||||
.OrderBy(u => u.CreateTime, OrderByType.Desc)
|
.OrderBy(u => u.CreateTime, OrderByType.Desc)
|
||||||
.Select<ExportLogDto>().ToListAsync();
|
.Select<ExportLogDto>().ToListAsync();
|
||||||
|
|
||||||
IExcelExporter excelExporter = new ExcelExporter();
|
var res = await ((IExcelExporter)new ExcelExporter()).ExportAsByteArray(logExList);
|
||||||
var res = await excelExporter.ExportAsByteArray(logExList);
|
|
||||||
return new FileStreamResult(new MemoryStream(res), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "异常日志.xlsx" };
|
return new FileStreamResult(new MemoryStream(res), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "异常日志.xlsx" };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -77,8 +77,7 @@ public class SysLogOpService : IDynamicApiController, ITransient
|
|||||||
.OrderBy(u => u.CreateTime, OrderByType.Desc)
|
.OrderBy(u => u.CreateTime, OrderByType.Desc)
|
||||||
.Select<ExportLogDto>().ToListAsync();
|
.Select<ExportLogDto>().ToListAsync();
|
||||||
|
|
||||||
IExcelExporter excelExporter = new ExcelExporter();
|
var res = await ((IExcelExporter)new ExcelExporter()).ExportAsByteArray(logOpList);
|
||||||
var res = await excelExporter.ExportAsByteArray(logOpList);
|
|
||||||
return new FileStreamResult(new MemoryStream(res), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "操作日志.xlsx" };
|
return new FileStreamResult(new MemoryStream(res), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "操作日志.xlsx" };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -287,7 +287,7 @@ public class SysOrgService : IDynamicApiController, ITransient
|
|||||||
[NonAction]
|
[NonAction]
|
||||||
public async Task<List<long>> GetUserOrgIdList()
|
public async Task<List<long>> GetUserOrgIdList()
|
||||||
{
|
{
|
||||||
if (_userManager.SuperAdmin) return new();
|
if (_userManager.SuperAdmin) return [];
|
||||||
return await GetUserOrgIdList(_userManager.UserId, _userManager.OrgId);
|
return await GetUserOrgIdList(_userManager.UserId, _userManager.OrgId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -325,7 +325,7 @@ public class SysOrgService : IDynamicApiController, ITransient
|
|||||||
private async Task<List<long>> GetUserRoleOrgIdList(long userId, long userOrgId)
|
private async Task<List<long>> GetUserRoleOrgIdList(long userId, long userOrgId)
|
||||||
{
|
{
|
||||||
var roleList = await _sysUserRoleService.GetUserRoleList(userId);
|
var roleList = await _sysUserRoleService.GetUserRoleList(userId);
|
||||||
if (roleList.Count < 1) return new(); // 空机构Id集合
|
if (roleList.Count < 1) return []; // 空机构Id集合
|
||||||
|
|
||||||
return await GetUserOrgIdList(roleList, userId, userOrgId);
|
return await GetUserOrgIdList(roleList, userId, userOrgId);
|
||||||
}
|
}
|
||||||
@ -345,7 +345,7 @@ public class SysOrgService : IDynamicApiController, ITransient
|
|||||||
var roleList = await _sysUserRoleService.GetUserRoleList(userId);
|
var roleList = await _sysUserRoleService.GetUserRoleList(userId);
|
||||||
if (roleList != null && roleList.Exists(r => r.Code == role.Code)) return true;
|
if (roleList != null && roleList.Exists(r => r.Code == role.Code)) return true;
|
||||||
|
|
||||||
roleList = new List<SysRole> { role };
|
roleList = [role];
|
||||||
var orgIds = await GetUserOrgIdList(roleList, userId, userOrgId);
|
var orgIds = await GetUserOrgIdList(roleList, userId, userOrgId);
|
||||||
return orgIds.Contains(userOrgId);
|
return orgIds.Contains(userOrgId);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -108,8 +108,7 @@ public class SysRegionService : IDynamicApiController, ITransient
|
|||||||
input.Code = input.Code?.Trim() ?? "";
|
input.Code = input.Code?.Trim() ?? "";
|
||||||
if (input.Code.Length != 12 && input.Code.Length != 9 && input.Code.Length != 6) throw Oops.Oh(ErrorCodeEnum.R2003);
|
if (input.Code.Length != 12 && input.Code.Length != 9 && input.Code.Length != 6) throw Oops.Oh(ErrorCodeEnum.R2003);
|
||||||
|
|
||||||
var sysRegion = await _sysRegionRep.GetByIdAsync(input.Id);
|
var sysRegion = await _sysRegionRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
|
||||||
if (sysRegion == null) throw Oops.Oh(ErrorCodeEnum.D1002);
|
|
||||||
|
|
||||||
if (sysRegion.Pid != input.Pid && input.Pid != 0)
|
if (sysRegion.Pid != input.Pid && input.Pid != 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -164,7 +164,7 @@ public class SysTenantService : IDynamicApiController, ITransient
|
|||||||
if (tenant == null || tenant.ConfigId == SqlSugarConst.MainConfigId)
|
if (tenant == null || tenant.ConfigId == SqlSugarConst.MainConfigId)
|
||||||
throw Oops.Oh(ErrorCodeEnum.Z1001);
|
throw Oops.Oh(ErrorCodeEnum.Z1001);
|
||||||
|
|
||||||
if (!Enum.IsDefined(typeof(StatusEnum), input.Status))
|
if (!Enum.IsDefined(input.Status))
|
||||||
throw Oops.Oh(ErrorCodeEnum.D3005);
|
throw Oops.Oh(ErrorCodeEnum.D3005);
|
||||||
|
|
||||||
tenant.Status = input.Status;
|
tenant.Status = input.Status;
|
||||||
@ -381,7 +381,7 @@ public class SysTenantService : IDynamicApiController, ITransient
|
|||||||
public async Task<List<long>> GetOwnMenuList([FromQuery] TenantUserInput input)
|
public async Task<List<long>> GetOwnMenuList([FromQuery] TenantUserInput input)
|
||||||
{
|
{
|
||||||
var roleIds = await _sysUserRoleService.GetUserRoleIdList(input.UserId);
|
var roleIds = await _sysUserRoleService.GetUserRoleIdList(input.UserId);
|
||||||
return await _sysRoleMenuService.GetRoleMenuIdList(new List<long> { roleIds[0] });
|
return await _sysRoleMenuService.GetRoleMenuIdList([roleIds[0]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@ -548,7 +548,7 @@ public static class SqlSugarSetup
|
|||||||
{
|
{
|
||||||
var instance = Activator.CreateInstance(seedType);
|
var instance = Activator.CreateInstance(seedType);
|
||||||
var hasDataMethod = seedType.GetMethod("HasData");
|
var hasDataMethod = seedType.GetMethod("HasData");
|
||||||
var seedData = ((IEnumerable)hasDataMethod?.Invoke(instance, null))?.Cast<object>().ToList() ?? new List<object>();
|
var seedData = ((IEnumerable)hasDataMethod?.Invoke(instance, null))?.Cast<object>().ToList() ?? [];
|
||||||
if (seedData.Count == 0) continue;
|
if (seedData.Count == 0) continue;
|
||||||
|
|
||||||
var entityType = seedType.GetInterfaces().First().GetGenericArguments().First();
|
var entityType = seedType.GetInterfaces().First().GetGenericArguments().First();
|
||||||
|
|||||||
@ -229,12 +229,10 @@ public static class CommonUtil
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static async Task<ICollection<T>> ImportExcelData<T>([Required] IFormFile file) where T : class, new()
|
public static async Task<ICollection<T>> ImportExcelData<T>([Required] IFormFile file) where T : class, new()
|
||||||
{
|
{
|
||||||
IImporter importer = new ExcelImporter();
|
var res = await ((IImporter)new ExcelImporter()).Import<T>(file.OpenReadStream());
|
||||||
var res = await importer.Import<T>(file.OpenReadStream());
|
|
||||||
var message = string.Empty;
|
|
||||||
|
|
||||||
if (!res.HasError) return res.Data;
|
if (!res.HasError) return res.Data;
|
||||||
|
|
||||||
|
var message = string.Empty;
|
||||||
if (res.Exception != null)
|
if (res.Exception != null)
|
||||||
message += $"\r\n{res.Exception.Message}";
|
message += $"\r\n{res.Exception.Message}";
|
||||||
foreach (DataRowErrorInfo drErrorInfo in res.RowErrors)
|
foreach (DataRowErrorInfo drErrorInfo in res.RowErrors)
|
||||||
@ -256,20 +254,19 @@ public static class CommonUtil
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static async Task<ICollection<T>> ImportExcelData<T>([Required] IFormFile file, Func<ImportResult<T>, ImportResult<T>> importResultCallback = null) where T : class, new()
|
public static async Task<ICollection<T>> ImportExcelData<T>([Required] IFormFile file, Func<ImportResult<T>, ImportResult<T>> importResultCallback = null) where T : class, new()
|
||||||
{
|
{
|
||||||
IImporter importer = new ExcelImporter();
|
|
||||||
var resultStream = new MemoryStream();
|
var resultStream = new MemoryStream();
|
||||||
var res = await importer.Import<T>(file.OpenReadStream(), resultStream, importResultCallback);
|
var res = await ((IImporter)new ExcelImporter()).Import<T>(file.OpenReadStream(), resultStream, importResultCallback);
|
||||||
resultStream.Seek(0, SeekOrigin.Begin);
|
resultStream.Seek(0, SeekOrigin.Begin);
|
||||||
var userId = App.User?.FindFirst(ClaimConst.UserId)?.Value;
|
if (!res.HasError) return res.Data;
|
||||||
|
|
||||||
|
var message = string.Empty;
|
||||||
|
if (res.Exception != null)
|
||||||
|
message += $"\r\n{res.Exception.Message}";
|
||||||
|
|
||||||
|
var userId = App.User?.FindFirst(ClaimConst.UserId)?.Value;
|
||||||
App.GetRequiredService<SysCacheService>().Remove(CacheConst.KeyExcelTemp + userId);
|
App.GetRequiredService<SysCacheService>().Remove(CacheConst.KeyExcelTemp + userId);
|
||||||
App.GetRequiredService<SysCacheService>().Set(CacheConst.KeyExcelTemp + userId, resultStream, TimeSpan.FromMinutes(5));
|
App.GetRequiredService<SysCacheService>().Set(CacheConst.KeyExcelTemp + userId, resultStream, TimeSpan.FromMinutes(5));
|
||||||
|
|
||||||
var message = string.Empty;
|
|
||||||
if (!res.HasError) return res.Data;
|
|
||||||
|
|
||||||
if (res.Exception != null)
|
|
||||||
message += $"\r\n{res.Exception.Message}";
|
|
||||||
foreach (DataRowErrorInfo drErrorInfo in res.RowErrors)
|
foreach (DataRowErrorInfo drErrorInfo in res.RowErrors)
|
||||||
{
|
{
|
||||||
message = drErrorInfo.FieldErrors.Aggregate(message, (current, item) => current + $"\r\n{item.Key}:{item.Value}(文件第{drErrorInfo.RowIndex}行)");
|
message = drErrorInfo.FieldErrors.Aggregate(message, (current, item) => current + $"\r\n{item.Key}:{item.Value}(文件第{drErrorInfo.RowIndex}行)");
|
||||||
@ -278,7 +275,7 @@ public static class CommonUtil
|
|||||||
message += "\r\n字段缺失:" + string.Join(",", res.TemplateErrors.Select(m => m.RequireColumnName).ToList());
|
message += "\r\n字段缺失:" + string.Join(",", res.TemplateErrors.Select(m => m.RequireColumnName).ToList());
|
||||||
|
|
||||||
if (message.Length > 200)
|
if (message.Length > 200)
|
||||||
message = message.Substring(0, 200) + "...\r\n异常过多,建议下载错误标记文件查看详细错误信息并重新导入。";
|
message = string.Concat(message.AsSpan(0, 200), "...\r\n异常过多,建议下载错误标记文件查看详细错误信息并重新导入。");
|
||||||
throw Oops.Oh("导入异常:" + message);
|
throw Oops.Oh("导入异常:" + message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -294,8 +291,7 @@ public static class CommonUtil
|
|||||||
var newFile = await sysFileService.UploadFile(new UploadFileInput { File = file });
|
var newFile = await sysFileService.UploadFile(new UploadFileInput { File = file });
|
||||||
var filePath = Path.Combine(App.WebHostEnvironment.WebRootPath, newFile.FilePath!, newFile.Id + newFile.Suffix);
|
var filePath = Path.Combine(App.WebHostEnvironment.WebRootPath, newFile.FilePath!, newFile.Id + newFile.Suffix);
|
||||||
|
|
||||||
IImporter importer = new ExcelImporter();
|
var res = await ((IImporter)new ExcelImporter()).Import<T>(filePath);
|
||||||
var res = await importer.Import<T>(filePath);
|
|
||||||
|
|
||||||
// 删除文件
|
// 删除文件
|
||||||
_ = sysFileService.DeleteFile(new DeleteFileInput { Id = newFile.Id });
|
_ = sysFileService.DeleteFile(new DeleteFileInput { Id = newFile.Id });
|
||||||
@ -307,7 +303,7 @@ public static class CommonUtil
|
|||||||
if (res.TemplateErrors?.Count > 0)
|
if (res.TemplateErrors?.Count > 0)
|
||||||
throw Oops.Oh("模板异常:" + res.TemplateErrors.Select(x => $"[{x.RequireColumnName}]{x.Message}").Join("\n"));
|
throw Oops.Oh("模板异常:" + res.TemplateErrors.Select(x => $"[{x.RequireColumnName}]{x.Message}").Join("\n"));
|
||||||
|
|
||||||
return res.Data.ToList();
|
return [.. res.Data];
|
||||||
}
|
}
|
||||||
|
|
||||||
// 例:List<Dm_ApplyDemo> ls = CommonUtil.ParseList<Dm_ApplyDemoInport, Dm_ApplyDemo>(importResult.Data);
|
// 例:List<Dm_ApplyDemo> ls = CommonUtil.ParseList<Dm_ApplyDemoInport, Dm_ApplyDemo>(importResult.Data);
|
||||||
|
|||||||
@ -29,7 +29,7 @@ public class ExcelHelper
|
|||||||
// 标记校验信息
|
// 标记校验信息
|
||||||
tasks.Add(Task.Run(() =>
|
tasks.Add(Task.Run(() =>
|
||||||
{
|
{
|
||||||
if (!storageable.TotalList.Any()) return;
|
if (storageable.TotalList.Count == 0) return;
|
||||||
|
|
||||||
// 通过Id标记校验信息
|
// 通过Id标记校验信息
|
||||||
var itemMap = pageItems.ToDictionary(u => u.Id, u => u);
|
var itemMap = pageItems.ToDictionary(u => u.Id, u => u);
|
||||||
@ -46,11 +46,11 @@ public class ExcelHelper
|
|||||||
|
|
||||||
// 仅导出错误记录
|
// 仅导出错误记录
|
||||||
var errorList = result.Where(u => !string.IsNullOrWhiteSpace(u.Error));
|
var errorList = result.Where(u => !string.IsNullOrWhiteSpace(u.Error));
|
||||||
return ExportData(errorList.Any() ? errorList : new List<IN>());
|
return ExportData(errorList.Any() ? errorList : []);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
App.HttpContext.Response.Headers["Content-Type"] = "application/json; charset=utf-8";
|
App.HttpContext.Response.Headers.ContentType = "application/json; charset=utf-8";
|
||||||
throw Oops.Oh(new AdminResult<object>
|
throw Oops.Oh(new AdminResult<object>
|
||||||
{
|
{
|
||||||
Code = 500,
|
Code = 500,
|
||||||
|
|||||||
@ -30,8 +30,8 @@ namespace Admin.NET.Core;
|
|||||||
|
|
||||||
public class GM
|
public class GM
|
||||||
{
|
{
|
||||||
private static X9ECParameters x9ECParameters = GMNamedCurves.GetByName("sm2p256v1");
|
private static readonly X9ECParameters x9ECParameters = GMNamedCurves.GetByName("sm2p256v1");
|
||||||
private static ECDomainParameters ecDomainParameters = new(x9ECParameters.Curve, x9ECParameters.G, x9ECParameters.N);
|
private static readonly ECDomainParameters ecDomainParameters = new(x9ECParameters.Curve, x9ECParameters.G, x9ECParameters.N);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -162,7 +162,7 @@ public class GM
|
|||||||
|
|
||||||
public static byte[] Sm2EncryptOld(byte[] data, AsymmetricKeyParameter pubkey)
|
public static byte[] Sm2EncryptOld(byte[] data, AsymmetricKeyParameter pubkey)
|
||||||
{
|
{
|
||||||
SM2Engine sm2Engine = new SM2Engine();
|
SM2Engine sm2Engine = new();
|
||||||
sm2Engine.Init(true, new ParametersWithRandom(pubkey, new SecureRandom()));
|
sm2Engine.Init(true, new ParametersWithRandom(pubkey, new SecureRandom()));
|
||||||
return sm2Engine.ProcessBlock(data, 0, data.Length);
|
return sm2Engine.ProcessBlock(data, 0, data.Length);
|
||||||
}
|
}
|
||||||
@ -176,7 +176,7 @@ public class GM
|
|||||||
|
|
||||||
public static byte[] Sm2DecryptOld(byte[] data, AsymmetricKeyParameter key)
|
public static byte[] Sm2DecryptOld(byte[] data, AsymmetricKeyParameter key)
|
||||||
{
|
{
|
||||||
SM2Engine sm2Engine = new SM2Engine();
|
SM2Engine sm2Engine = new();
|
||||||
sm2Engine.Init(false, key);
|
sm2Engine.Init(false, key);
|
||||||
return sm2Engine.ProcessBlock(data, 0, data.Length);
|
return sm2Engine.ProcessBlock(data, 0, data.Length);
|
||||||
}
|
}
|
||||||
@ -242,13 +242,13 @@ public class GM
|
|||||||
private static byte[] RsPlainByteArrayToAsn1(byte[] sign)
|
private static byte[] RsPlainByteArrayToAsn1(byte[] sign)
|
||||||
{
|
{
|
||||||
if (sign.Length != RS_LEN * 2) throw new ArgumentException("err rs. ");
|
if (sign.Length != RS_LEN * 2) throw new ArgumentException("err rs. ");
|
||||||
BigInteger r = new BigInteger(1, Arrays.CopyOfRange(sign, 0, RS_LEN));
|
BigInteger r = new(1, Arrays.CopyOfRange(sign, 0, RS_LEN));
|
||||||
BigInteger s = new BigInteger(1, Arrays.CopyOfRange(sign, RS_LEN, RS_LEN * 2));
|
BigInteger s = new(1, Arrays.CopyOfRange(sign, RS_LEN, RS_LEN * 2));
|
||||||
Asn1EncodableVector v = new Asn1EncodableVector
|
Asn1EncodableVector v =
|
||||||
{
|
[
|
||||||
new DerInteger(r),
|
new DerInteger(r),
|
||||||
new DerInteger(s)
|
new DerInteger(s)
|
||||||
};
|
];
|
||||||
|
|
||||||
return new DerSequence(v).GetEncoded("DER");
|
return new DerSequence(v).GetEncoded("DER");
|
||||||
}
|
}
|
||||||
@ -287,8 +287,7 @@ public class GM
|
|||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
if (fileStream != null)
|
fileStream?.Close();
|
||||||
fileStream.Close();
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -302,11 +301,13 @@ public class GM
|
|||||||
|
|
||||||
private static byte[] ToByteArray(int i)
|
private static byte[] ToByteArray(int i)
|
||||||
{
|
{
|
||||||
byte[] byteArray = new byte[4];
|
byte[] byteArray =
|
||||||
byteArray[0] = (byte)(i >> 24);
|
[
|
||||||
byteArray[1] = (byte)((i & 0xFFFFFF) >> 16);
|
(byte)(i >> 24),
|
||||||
byteArray[2] = (byte)((i & 0xFFFF) >> 8);
|
(byte)((i & 0xFFFFFF) >> 16),
|
||||||
byteArray[3] = (byte)(i & 0xFF);
|
(byte)((i & 0xFFFF) >> 8),
|
||||||
|
(byte)(i & 0xFF),
|
||||||
|
];
|
||||||
return byteArray;
|
return byteArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -319,12 +320,12 @@ public class GM
|
|||||||
|
|
||||||
private static byte[] Join(params byte[][] byteArrays)
|
private static byte[] Join(params byte[][] byteArrays)
|
||||||
{
|
{
|
||||||
List<byte> byteSource = new();
|
List<byte> byteSource = [];
|
||||||
for (int i = 0; i < byteArrays.Length; i++)
|
for (int i = 0; i < byteArrays.Length; i++)
|
||||||
{
|
{
|
||||||
byteSource.AddRange(byteArrays[i]);
|
byteSource.AddRange(byteArrays[i]);
|
||||||
}
|
}
|
||||||
byte[] data = byteSource.ToArray();
|
byte[] data = [.. byteSource];
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -341,7 +342,7 @@ public class GM
|
|||||||
{
|
{
|
||||||
int ct = 1;
|
int ct = 1;
|
||||||
int end = (int)Math.Ceiling(klen * 1.0 / 32);
|
int end = (int)Math.Ceiling(klen * 1.0 / 32);
|
||||||
List<byte> byteSource = new();
|
List<byte> byteSource = [];
|
||||||
|
|
||||||
for (int i = 1; i < end; i++)
|
for (int i = 1; i < end; i++)
|
||||||
{
|
{
|
||||||
@ -355,7 +356,7 @@ public class GM
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
byteSource.AddRange(Arrays.CopyOfRange(last, 0, klen % 32));
|
byteSource.AddRange(Arrays.CopyOfRange(last, 0, klen % 32));
|
||||||
return byteSource.ToArray();
|
return [.. byteSource];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] Sm4DecryptCBC(byte[] keyBytes, byte[] cipher, byte[] iv, string algo)
|
public static byte[] Sm4DecryptCBC(byte[] keyBytes, byte[] cipher, byte[] iv, string algo)
|
||||||
@ -365,7 +366,7 @@ public class GM
|
|||||||
|
|
||||||
KeyParameter key = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);
|
KeyParameter key = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);
|
||||||
IBufferedCipher c = CipherUtilities.GetCipher(algo);
|
IBufferedCipher c = CipherUtilities.GetCipher(algo);
|
||||||
if (iv == null) iv = ZeroIv(algo);
|
iv ??= ZeroIv(algo);
|
||||||
c.Init(false, new ParametersWithIV(key, iv));
|
c.Init(false, new ParametersWithIV(key, iv));
|
||||||
return c.DoFinal(cipher);
|
return c.DoFinal(cipher);
|
||||||
}
|
}
|
||||||
@ -377,7 +378,7 @@ public class GM
|
|||||||
|
|
||||||
KeyParameter key = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);
|
KeyParameter key = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);
|
||||||
IBufferedCipher c = CipherUtilities.GetCipher(algo);
|
IBufferedCipher c = CipherUtilities.GetCipher(algo);
|
||||||
if (iv == null) iv = ZeroIv(algo);
|
iv ??= ZeroIv(algo);
|
||||||
c.Init(true, new ParametersWithIV(key, iv));
|
c.Init(true, new ParametersWithIV(key, iv));
|
||||||
return c.DoFinal(plain);
|
return c.DoFinal(plain);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -241,13 +241,13 @@ public class Startup : AppStartup
|
|||||||
options.EnableForHttps = true;
|
options.EnableForHttps = true;
|
||||||
options.Providers.Add<BrotliCompressionProvider>();
|
options.Providers.Add<BrotliCompressionProvider>();
|
||||||
options.Providers.Add<GzipCompressionProvider>();
|
options.Providers.Add<GzipCompressionProvider>();
|
||||||
options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[]
|
options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
|
||||||
{
|
[
|
||||||
"text/html; charset=utf-8",
|
"text/html; charset=utf-8",
|
||||||
"application/xhtml+xml",
|
"application/xhtml+xml",
|
||||||
"application/atom+xml",
|
"application/atom+xml",
|
||||||
"image/svg+xml"
|
"image/svg+xml"
|
||||||
});
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 注册虚拟文件系统服务
|
// 注册虚拟文件系统服务
|
||||||
@ -286,7 +286,7 @@ public class Startup : AppStartup
|
|||||||
var cpMappings = App.GetConfig<Dictionary<string, string>>("StaticContentTypeMappings");
|
var cpMappings = App.GetConfig<Dictionary<string, string>>("StaticContentTypeMappings");
|
||||||
if (cpMappings != null)
|
if (cpMappings != null)
|
||||||
{
|
{
|
||||||
if (cpMappings.Keys.Contains(".*"))
|
if (cpMappings.TryGetValue(".*", out string value))
|
||||||
{
|
{
|
||||||
app.UseStaticFiles(new StaticFileOptions
|
app.UseStaticFiles(new StaticFileOptions
|
||||||
{
|
{
|
||||||
@ -294,7 +294,7 @@ public class Startup : AppStartup
|
|||||||
// RequestPath = "/static",
|
// RequestPath = "/static",
|
||||||
ServeUnknownFileTypes = true, // 允许服务未知文件类型,以便能处理.dll这种非默认的静态文件类型
|
ServeUnknownFileTypes = true, // 允许服务未知文件类型,以便能处理.dll这种非默认的静态文件类型
|
||||||
// DefaultContentType = "application/octet-stream" // 为未知文件类型设置一个通用的内容类型
|
// DefaultContentType = "application/octet-stream" // 为未知文件类型设置一个通用的内容类型
|
||||||
DefaultContentType = cpMappings[".*"]
|
DefaultContentType = value
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user