diff --git a/Admin.NET/Admin.NET.Application/Service/App/Auth/AppAuthService.cs b/Admin.NET/Admin.NET.Application/Service/App/Auth/AppAuthService.cs
index de96e68d..e9d73a5f 100644
--- a/Admin.NET/Admin.NET.Application/Service/App/Auth/AppAuthService.cs
+++ b/Admin.NET/Admin.NET.Application/Service/App/Auth/AppAuthService.cs
@@ -89,7 +89,7 @@ public class AppAuthService : IDynamicApiController, ITransient
// 国密SM2解密(前端密码传输SM2加密后的)
try
{
- input.Password = CryptogramUtil.SM2Decrypt(input.Password);
+ input.Password = CryptogramHelper.SM2Decrypt(input.Password);
}
catch
{
@@ -113,7 +113,7 @@ public class AppAuthService : IDynamicApiController, ITransient
///
private void VerifyPassword(LoginInput input, string keyErrorPasswordCount, int errorPasswordCount, SysUser user)
{
- if (CryptogramUtil.CryptoType == CryptogramEnum.MD5.ToString())
+ if (CryptogramHelper.CryptoType == CryptogramEnum.MD5.ToString())
{
if (!user.Password.Equals(MD5Encryption.Encrypt(input.Password)))
{
@@ -123,7 +123,7 @@ public class AppAuthService : IDynamicApiController, ITransient
}
else
{
- if (!CryptogramUtil.Decrypt(user.Password).Equals(input.Password))
+ if (!CryptogramHelper.Decrypt(user.Password).Equals(input.Password))
{
_sysCacheService.Set(keyErrorPasswordCount, ++errorPasswordCount, TimeSpan.FromMinutes(30));
throw Oops.Oh(ErrorCodeEnum.D1000);
@@ -284,18 +284,18 @@ public class AppAuthService : IDynamicApiController, ITransient
public async Task ChangePwd(ChangePwdInput input)
{
// 国密SM2解密(前端密码传输SM2加密后的)
- input.PasswordOld = CryptogramUtil.SM2Decrypt(input.PasswordOld);
- input.PasswordNew = CryptogramUtil.SM2Decrypt(input.PasswordNew);
+ input.PasswordOld = CryptogramHelper.SM2Decrypt(input.PasswordOld);
+ input.PasswordNew = CryptogramHelper.SM2Decrypt(input.PasswordNew);
var user = await _sysUserRep.GetByIdAsync(_appUserManager.UserId) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
- if (CryptogramUtil.CryptoType == CryptogramEnum.MD5.ToString())
+ if (CryptogramHelper.CryptoType == CryptogramEnum.MD5.ToString())
{
if (user.Password != MD5Encryption.Encrypt(input.PasswordOld))
throw Oops.Oh(ErrorCodeEnum.D1004);
}
else
{
- if (CryptogramUtil.Decrypt(user.Password) != input.PasswordOld)
+ if (CryptogramHelper.Decrypt(user.Password) != input.PasswordOld)
throw Oops.Oh(ErrorCodeEnum.D1004);
}
@@ -307,12 +307,12 @@ public class AppAuthService : IDynamicApiController, ITransient
{
var sysConfig = await _sysConfigService.GetConfig(ConfigConst.SysPasswordStrengthExpression);
user.Password = input.PasswordNew.TryValidate(sysConfig.Value)
- ? CryptogramUtil.Encrypt(input.PasswordNew)
+ ? CryptogramHelper.Encrypt(input.PasswordNew)
: throw Oops.Oh(sysConfig.Remark);
}
else
{
- user.Password = CryptogramUtil.Encrypt(input.PasswordNew);
+ user.Password = CryptogramHelper.Encrypt(input.PasswordNew);
}
return await _sysUserRep.AsUpdateable(user).UpdateColumns(u => u.Password).ExecuteCommandAsync();
diff --git a/Admin.NET/Admin.NET.Application/Service/Test/TestService.cs b/Admin.NET/Admin.NET.Application/Service/Test/TestService.cs
index f1db5e9b..6321f132 100644
--- a/Admin.NET/Admin.NET.Application/Service/Test/TestService.cs
+++ b/Admin.NET/Admin.NET.Application/Service/Test/TestService.cs
@@ -50,7 +50,7 @@ public class TestService : IDynamicApiController
{
//L.SetCulture("en-US", true);
- var cultureName = L.GetSelectCulture().Culture.Name;
+ //var cultureName = L.GetSelectCulture().Culture.Name;
return L.Text["Admin.NET 通用权限开发平台"];
}
diff --git a/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj b/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj
index aa595635..27dcf9d9 100644
--- a/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj
+++ b/Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj
@@ -28,9 +28,9 @@
-
-
-
+
+
+
@@ -68,7 +68,6 @@
-
@@ -79,7 +78,6 @@
-
diff --git a/Admin.NET/Admin.NET.Core/Attribute/DictAttribute.cs b/Admin.NET/Admin.NET.Core/Attribute/DictAttribute.cs
index 1436b400..c01e91a9 100644
--- a/Admin.NET/Admin.NET.Core/Attribute/DictAttribute.cs
+++ b/Admin.NET/Admin.NET.Core/Attribute/DictAttribute.cs
@@ -75,8 +75,7 @@ public class DictAttribute : ValidationAttribute, ITransient
if (value == null && AllowNullValue) return ValidationResult.Success;
// 处理集合为空的情况
- var collection = value as IEnumerable;
- if (collection == null) return ValidationResult.Success;
+ if (value is not IEnumerable collection) return ValidationResult.Success;
// 获取集合的元素类型
var elementType = propertyType.GetGenericArguments()[0];
diff --git a/Admin.NET/Admin.NET.Core/Entity/SysUser.cs b/Admin.NET/Admin.NET.Core/Entity/SysUser.cs
index 11434567..7b434a4e 100644
--- a/Admin.NET/Admin.NET.Core/Entity/SysUser.cs
+++ b/Admin.NET/Admin.NET.Core/Entity/SysUser.cs
@@ -126,7 +126,7 @@ public partial class SysUser : EntityTenant
///
/// 毕业院校
- /// COLLEGE
+ ///
[SugarColumn(ColumnDescription = "毕业院校", Length = 128)]
[MaxLength(128)]
public string? College { get; set; }
diff --git a/Admin.NET/Admin.NET.Core/Enum/ErrorCodeEnum.cs b/Admin.NET/Admin.NET.Core/Enum/ErrorCodeEnum.cs
index c98d42b5..71ce30c5 100644
--- a/Admin.NET/Admin.NET.Core/Enum/ErrorCodeEnum.cs
+++ b/Admin.NET/Admin.NET.Core/Enum/ErrorCodeEnum.cs
@@ -530,7 +530,7 @@ public enum ErrorCodeEnum
D8000,
///
- /// 不允许的文件类型
+ /// 不允许的文件类型
///
[ErrorCodeItemMetadata("不允许的文件类型:{0}")]
D8001,
diff --git a/Admin.NET/Admin.NET.Core/Extension/EnumExtension.cs b/Admin.NET/Admin.NET.Core/Extension/EnumExtension.cs
index 2b559879..c6c6abce 100644
--- a/Admin.NET/Admin.NET.Core/Extension/EnumExtension.cs
+++ b/Admin.NET/Admin.NET.Core/Extension/EnumExtension.cs
@@ -31,7 +31,7 @@ public static class EnumExtension
throw new ArgumentException("Type '" + enumType.Name + "' is not an enum.");
// 查询缓存
- var enumDic = EnumNameValueDict.TryGetValue(enumType, out var value) ? value : new Dictionary();
+ var enumDic = EnumNameValueDict.TryGetValue(enumType, out var value) ? value : [];
if (enumDic.Count != 0)
return enumDic;
// 取枚举类型的Key/Value字典集合
@@ -76,9 +76,7 @@ public static class EnumExtension
throw new ArgumentException("Type '" + enumType.Name + "' is not an enum.");
// 查询缓存
- var enumDic = EnumDisplayValueDict.TryGetValue(enumType, out var value)
- ? value
- : new Dictionary();
+ var enumDic = EnumDisplayValueDict.TryGetValue(enumType, out var value) ? value : [];
if (enumDic.Count != 0)
return enumDic;
// 取枚举类型的Key/Value字典集合
@@ -106,7 +104,11 @@ public static class EnumExtension
foreach (var enumField in enumFields)
{
var intValue = (int)enumField.GetValue(enumType)!;
- var desc = enumField.GetDescriptionValue();
+ // 获取字段的指定特性,不包含继承中的特性
+ object[] customAttributes = enumField.GetCustomAttributes(typeof(DescriptionAttribute), false);
+ // 如果没有数据返回null
+ var desc = customAttributes.Length > 0 ? (DescriptionAttribute)customAttributes[0] : null;
+
enumDic[intValue] = desc != null && !string.IsNullOrEmpty(desc.Description) ? desc.Description : enumField.Name;
}
diff --git a/Admin.NET/Admin.NET.Core/Utils/EnumerableExtensions.cs b/Admin.NET/Admin.NET.Core/Extension/EnumerableExtensions.cs
similarity index 97%
rename from Admin.NET/Admin.NET.Core/Utils/EnumerableExtensions.cs
rename to Admin.NET/Admin.NET.Core/Extension/EnumerableExtensions.cs
index f4270ee6..896caab7 100644
--- a/Admin.NET/Admin.NET.Core/Utils/EnumerableExtensions.cs
+++ b/Admin.NET/Admin.NET.Core/Extension/EnumerableExtensions.cs
@@ -4,7 +4,7 @@
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
-namespace Admin.NET.Core.Utils;
+namespace Admin.NET.Core;
public static class EnumerableExtensions
{
diff --git a/Admin.NET/Admin.NET.Core/Extension/HttpContextExtension.cs b/Admin.NET/Admin.NET.Core/Extension/HttpContextExtension.cs
index 3199c62a..d8791e81 100644
--- a/Admin.NET/Admin.NET.Core/Extension/HttpContextExtension.cs
+++ b/Admin.NET/Admin.NET.Core/Extension/HttpContextExtension.cs
@@ -42,7 +42,7 @@ public static class HttpContextExtension
{
ArgumentNullException.ThrowIfNull(context);
- return CommonUtil.GetClientDeviceInfo(context.Request.Headers.UserAgent);
+ return CommonHelper.GetClientDeviceInfo(context.Request.Headers.UserAgent);
}
///
diff --git a/Admin.NET/Admin.NET.Core/Extension/ListExtension.cs b/Admin.NET/Admin.NET.Core/Extension/ListExtension.cs
deleted file mode 100644
index 722cf510..00000000
--- a/Admin.NET/Admin.NET.Core/Extension/ListExtension.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
-//
-// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
-//
-// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
-
-namespace Admin.NET.Core;
-
-///
-/// List 扩展方法
-///
-public static class ListExtension
-{
- public static async Task ForEachAsync(this List list, Func func)
- {
- foreach (var value in list)
- {
- await func(value);
- }
- }
-
- public static async Task ForEachAsync(this IEnumerable source, Func action)
- {
- foreach (var value in source)
- {
- await action(value);
- }
- }
-
- public static void ForEach(this IEnumerable enumerable, Action consumer)
- {
- foreach (T item in enumerable)
- {
- consumer(item);
- }
- }
-
- public static void AddRange(this IList list, IEnumerable items)
- {
- if (list is List list2)
- {
- list2.AddRange(items);
- return;
- }
-
- foreach (T item in items)
- {
- list.Add(item);
- }
- }
-}
\ No newline at end of file
diff --git a/Admin.NET/Admin.NET.Core/Extension/ParseExtensions.cs b/Admin.NET/Admin.NET.Core/Extension/ParseExtensions.cs
new file mode 100644
index 00000000..3e33a373
--- /dev/null
+++ b/Admin.NET/Admin.NET.Core/Extension/ParseExtensions.cs
@@ -0,0 +1,459 @@
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Core;
+
+///
+/// 对象转换扩展方法
+///
+public static class ParseExtensions
+{
+ #region Bool
+
+ ///
+ /// 对象转布尔值
+ ///
+ ///
+ ///
+ public static bool ParseToBool(this object? thisValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value && bool.TryParse(thisValue.ToString(), out var reveal) && reveal;
+ }
+
+ #endregion Bool
+
+ #region Short
+
+ ///
+ /// 对象转短整数
+ ///
+ ///
+ ///
+ public static short ParseToShort(this object? thisValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ short.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : (short)0;
+ }
+
+ ///
+ /// 对象转短整数
+ ///
+ ///
+ ///
+ ///
+ public static short ParseToShort(this object? thisValue, short errorValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ short.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : errorValue;
+ }
+
+ #endregion Short
+
+ #region Long
+
+ ///
+ /// 对象转长整数
+ ///
+ ///
+ ///
+ public static long ParseToLong(this object? thisValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ long.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : 0L;
+ }
+
+ ///
+ /// 对象转长整数
+ ///
+ ///
+ ///
+ ///
+ public static long ParseToLong(this object? thisValue, long errorValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ long.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : errorValue;
+ }
+
+ #endregion Long
+
+ #region Float
+
+ ///
+ /// 对象转浮点数
+ /// ±1.5 x 10 e−45 至 ±3.4 x 10 e38 大约 6-9 位数字
+ ///
+ ///
+ ///
+ public static float ParseToFloat(this object? thisValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ float.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : 0.0F;
+ }
+
+ ///
+ /// 对象转浮点数
+ /// ±1.5 x 10 e−45 至 ±3.4 x 10 e38 大约 6-9 位数字
+ ///
+ ///
+ ///
+ ///
+ public static float ParseToFloat(this object? thisValue, float errorValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ float.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : errorValue;
+ }
+
+ #endregion Float
+
+ #region Double
+
+ ///
+ /// 对象转浮点数
+ /// ±5.0 × 10 e−324 到 ±1.7 × 10 e308 大约 15-17 位数字
+ ///
+ ///
+ ///
+ public static double ParseToDouble(this object? thisValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ double.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : 0.0D;
+ }
+
+ ///
+ /// 对象转浮点数
+ /// ±5.0 × 10 e−324 到 ±1.7 × 10 e308 大约 15-17 位数字
+ ///
+ ///
+ ///
+ ///
+ public static double ParseToDouble(this object? thisValue, double errorValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ double.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : errorValue;
+ }
+
+ #endregion Double
+
+ #region Decimal
+
+ ///
+ /// 对象转浮点数
+ /// ±1.0 x 10 e-28 至 ±7.9228 x 10 e28 28-29 位
+ ///
+ ///
+ ///
+ public static decimal ParseToDecimal(this object? thisValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ decimal.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : 0M;
+ }
+
+ ///
+ /// 对象转浮点数
+ /// ±1.0 x 10 e-28 至 ±7.9228 x 10 e28 28-29 位
+ ///
+ ///
+ ///
+ ///
+ public static decimal ParseToDecimal(this object? thisValue, decimal errorValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ decimal.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : errorValue;
+ }
+
+ #endregion Decimal
+
+ #region Int
+
+ ///
+ /// 对象转数字
+ ///
+ ///
+ ///
+ public static int ParseToInt(this object? thisValue)
+ {
+ return thisValue is null ? 0 :
+ thisValue != DBNull.Value && int.TryParse(thisValue.ToString(), out var reveal) ? reveal : 0;
+ }
+
+ ///
+ /// 对象转数字
+ ///
+ ///
+ ///
+ ///
+ public static int ParseToInt(this object? thisValue, int errorValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ int.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : errorValue;
+ }
+
+ #endregion Int
+
+ #region Money
+
+ ///
+ /// 对象转金额
+ ///
+ ///
+ ///
+ public static double ParseToMoney(this object? thisValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ double.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : 0;
+ }
+
+ ///
+ /// 对象转金额
+ ///
+ ///
+ ///
+ ///
+ public static double ParseToMoney(this object? thisValue, double errorValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ double.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : errorValue;
+ }
+
+ #endregion Money
+
+ #region String
+
+ ///
+ /// 对象转字符串
+ ///
+ ///
+ ///
+ public static string ParseToString(this object? thisValue)
+ {
+ return thisValue is not null ? thisValue.ToString()!.Trim() : string.Empty;
+ }
+
+ ///
+ /// 对象转字符串
+ ///
+ ///
+ ///
+ ///
+ public static string ParseToString(this object? thisValue, string errorValue)
+ {
+ return thisValue is not null ? thisValue.ToString()!.Trim() : errorValue;
+ }
+
+ ///
+ /// 判断是否为空
+ ///
+ ///
+ ///
+ public static bool IsEmptyOrNull(this object? thisValue)
+ {
+ return !thisValue.IsNotEmptyOrNull();
+ }
+
+ ///
+ /// 判断是否为空
+ ///
+ ///
+ ///
+ public static bool IsNotEmptyOrNull(this object? thisValue)
+ {
+ return thisValue is not null && thisValue.ParseToString() != string.Empty &&
+ thisValue.ParseToString() != string.Empty &&
+ thisValue.ParseToString() != "undefined" && thisValue.ParseToString() != "null";
+ }
+
+ ///
+ /// 判断是否为空或零
+ ///
+ ///
+ ///
+ public static bool IsNullOrZero(this object? thisValue)
+ {
+ return !thisValue.IsNotNullOrZero();
+ }
+
+ ///
+ /// 判断是否为空或零
+ ///
+ ///
+ ///
+ public static bool IsNotNullOrZero(this object? thisValue)
+ {
+ return thisValue.IsNotEmptyOrNull() && thisValue.ParseToString() != "0";
+ }
+
+ #endregion String
+
+ #region DateTime
+
+ ///
+ /// 对象转日期
+ ///
+ ///
+ ///
+ public static DateTime ParseToDateTime(this object? thisValue)
+ {
+ var reveal = DateTime.MinValue;
+ if (thisValue is not null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out reveal))
+ {
+ reveal = Convert.ToDateTime(thisValue);
+ }
+
+ return reveal;
+ }
+
+ ///
+ /// 对象转日期
+ ///
+ ///
+ ///
+ ///
+ public static DateTime ParseToDateTime(this object? thisValue, DateTime errorValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value && DateTime.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : errorValue;
+ }
+
+ #endregion DateTime
+
+ #region DateTimeOffset
+
+ ///
+ /// 对象转 DateTimeOffset
+ ///
+ ///
+ ///
+ public static DateTimeOffset ParseToDateTimeOffset(this object? thisValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ DateTimeOffset.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : DateTimeOffset.MinValue;
+ }
+
+ ///
+ /// 对象转 DateTimeOffset
+ ///
+ ///
+ ///
+ ///
+ public static DateTimeOffset ParseToDateTimeOffset(this object? thisValue, DateTimeOffset errorValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ DateTimeOffset.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : errorValue;
+ }
+
+ #endregion DateTimeOffset
+
+ #region TimeSpan
+
+ ///
+ /// 对象转 DateTimeOffset
+ ///
+ ///
+ ///
+ public static TimeSpan ParseToTimeSpan(this object? thisValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ TimeSpan.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : TimeSpan.Zero;
+ }
+
+ ///
+ /// 对象转 DateTimeOffset
+ ///
+ ///
+ ///
+ ///
+ public static TimeSpan ParseToTimeSpan(this object? thisValue, TimeSpan errorValue)
+ {
+ return thisValue is not null && thisValue != DBNull.Value &&
+ TimeSpan.TryParse(thisValue.ToString(), out var reveal)
+ ? reveal
+ : errorValue;
+ }
+
+ #endregion TimeSpan
+
+ #region Guid
+
+ ///
+ /// 将 string 转换为 Guid
+ /// 若转换失败,则返回 Guid.Empty,不抛出异常。
+ ///
+ ///
+ ///
+ public static Guid ParseToGuid(this object? thisValue)
+ {
+ try
+ {
+ return new Guid(thisValue.ParseToString());
+ }
+ catch
+ {
+ return Guid.Empty;
+ }
+ }
+
+ #endregion Guid
+
+ #region Dictionary
+
+ ///
+ /// 对象转换成字典
+ ///
+ ///
+ ///
+ public static IEnumerable> ParseToDictionary(this object? obj)
+ {
+ if (obj is not IEnumerable objDynamics)
+ {
+ yield break;
+ }
+
+ foreach (var objDynamic in objDynamics)
+ {
+ // 找到所有的没有此特性、或有此特性但忽略字段的属性
+ var item = (objDynamic as object).GetType().GetProperties()
+ .ToDictionary(prop => prop.Name, prop => prop.GetValue(objDynamic, null));
+
+ yield return item;
+ }
+ }
+
+ #endregion Dictionary
+
+}
\ No newline at end of file
diff --git a/Admin.NET/Admin.NET.Core/GlobalUsings.cs b/Admin.NET/Admin.NET.Core/GlobalUsings.cs
index 19392a71..fbcf2a7e 100644
--- a/Admin.NET/Admin.NET.Core/GlobalUsings.cs
+++ b/Admin.NET/Admin.NET.Core/GlobalUsings.cs
@@ -5,7 +5,6 @@
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
global using Admin.NET.Core.Service;
-global using Admin.NET.Core.Utils;
global using Furion;
global using Furion.ConfigurableOptions;
global using Furion.DatabaseAccessor;
diff --git a/Admin.NET/Admin.NET.Core/Logging/DatabaseLoggingWriter.cs b/Admin.NET/Admin.NET.Core/Logging/DatabaseLoggingWriter.cs
index f7994c67..6dfc933d 100644
--- a/Admin.NET/Admin.NET.Core/Logging/DatabaseLoggingWriter.cs
+++ b/Admin.NET/Admin.NET.Core/Logging/DatabaseLoggingWriter.cs
@@ -113,7 +113,7 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter, IDisposable
// 获取IP地理位置
if (string.IsNullOrEmpty(remoteIPv4))
remoteIPv4 = loggingMonitor.remoteIPv4;
- (string ipLocation, double? longitude, double? latitude) = CommonUtil.GetIpAddress(remoteIPv4);
+ (string ipLocation, double? longitude, double? latitude) = CommonHelper.GetIpAddress(remoteIPv4);
// 获取设备信息
var browser = "";
diff --git a/Admin.NET/Admin.NET.Core/Logging/ElasticSearchLoggingWriter.cs b/Admin.NET/Admin.NET.Core/Logging/ElasticSearchLoggingWriter.cs
index f68697a3..637d1800 100644
--- a/Admin.NET/Admin.NET.Core/Logging/ElasticSearchLoggingWriter.cs
+++ b/Admin.NET/Admin.NET.Core/Logging/ElasticSearchLoggingWriter.cs
@@ -57,7 +57,7 @@ public class ElasticSearchLoggingWriter : IDatabaseLoggingWriter, IDisposable
}
string remoteIPv4 = loggingMonitor.remoteIPv4;
- (string ipLocation, double? longitude, double? latitude) = CommonUtil.GetIpAddress(remoteIPv4);
+ (string ipLocation, double? longitude, double? latitude) = CommonHelper.GetIpAddress(remoteIPv4);
var sysLogOp = new SysLogOp
{
diff --git a/Admin.NET/Admin.NET.Core/Mqtt/DefaultMqttEventInterceptor.cs b/Admin.NET/Admin.NET.Core/Mqtt/DefaultMqttEventInterceptor.cs
index f77a0283..2c57ceb8 100644
--- a/Admin.NET/Admin.NET.Core/Mqtt/DefaultMqttEventInterceptor.cs
+++ b/Admin.NET/Admin.NET.Core/Mqtt/DefaultMqttEventInterceptor.cs
@@ -30,14 +30,14 @@ public class DefaultMqttEventInterceptor : MqttEventInterceptor
// 验证密码
var password = arg.Password;
- if (CryptogramUtil.CryptoType == CryptogramEnum.MD5.ToString())
+ if (CryptogramHelper.CryptoType == CryptogramEnum.MD5.ToString())
{
if (user.Password.Equals(MD5Encryption.Encrypt(password)))
return Task.CompletedTask;
}
else
{
- if (CryptogramUtil.Decrypt(user.Password).Equals(password))
+ if (CryptogramHelper.Decrypt(user.Password).Equals(password))
return Task.CompletedTask;
}
arg.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
diff --git a/Admin.NET/Admin.NET.Core/SeedData/SysUserSeedData.cs b/Admin.NET/Admin.NET.Core/SeedData/SysUserSeedData.cs
index e3777f90..1a5241c9 100644
--- a/Admin.NET/Admin.NET.Core/SeedData/SysUserSeedData.cs
+++ b/Admin.NET/Admin.NET.Core/SeedData/SysUserSeedData.cs
@@ -18,7 +18,7 @@ public class SysUserSeedData : ISqlSugarEntitySeedData
///
public IEnumerable HasData()
{
- var encryptPassword = CryptogramUtil.Encrypt(new SysConfigSeedData().HasData().First(u => u.Code == ConfigConst.SysPassword).Value);
+ var encryptPassword = CryptogramHelper.Encrypt(new SysConfigSeedData().HasData().First(u => u.Code == ConfigConst.SysPassword).Value);
var posList = new SysPosSeedData().HasData().ToList();
return
[
diff --git a/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs b/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs
index fcaa8886..30c7cd96 100644
--- a/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs
+++ b/Admin.NET/Admin.NET.Core/Service/Auth/SysAuthService.cs
@@ -81,7 +81,7 @@ public class SysAuthService : IDynamicApiController, ITransient
{
VerifyPassword(input.Password, keyPasswordErrorTimes, passwordErrorTimes, user);
}
- else if (!await App.GetRequiredService().AuthAccount(user.TenantId, userLdap.Account, CryptogramUtil.Decrypt(input.Password)))
+ else if (!await App.GetRequiredService().AuthAccount(user.TenantId, userLdap.Account, CryptogramHelper.Decrypt(input.Password)))
{
_sysCacheService.Set(keyPasswordErrorTimes, ++passwordErrorTimes, TimeSpan.FromMinutes(30));
throw Oops.Oh(ErrorCodeEnum.D1000);
@@ -143,20 +143,20 @@ public class SysAuthService : IDynamicApiController, ITransient
// 国密SM2解密(前端密码传输SM2加密后的)
try
{
- password = CryptogramUtil.SM2Decrypt(password);
+ password = CryptogramHelper.SM2Decrypt(password);
}
catch
{
throw Oops.Oh(ErrorCodeEnum.D0010);
}
- if (CryptogramUtil.CryptoType == CryptogramEnum.MD5.ToString())
+ if (CryptogramHelper.CryptoType == CryptogramEnum.MD5.ToString())
{
if (user.Password.Equals(MD5Encryption.Encrypt(password))) return;
}
else
{
- if (CryptogramUtil.Decrypt(user.Password).Equals(password)) return;
+ if (CryptogramHelper.Decrypt(user.Password).Equals(password)) return;
}
_sysCacheService.Set(keyPasswordErrorTimes, ++passwordErrorTimes, TimeSpan.FromMinutes(30));
@@ -186,7 +186,7 @@ public class SysAuthService : IDynamicApiController, ITransient
{
VerifyPassword(password, keyPasswordErrorTimes, passwordErrorTimes, user);
}
- else if (!await App.GetRequiredService().AuthAccount(user.TenantId.Value, userLdap.Account, CryptogramUtil.Decrypt(password)))
+ else if (!await App.GetRequiredService().AuthAccount(user.TenantId.Value, userLdap.Account, CryptogramHelper.Decrypt(password)))
{
_sysCacheService.Set(keyPasswordErrorTimes, ++passwordErrorTimes, TimeSpan.FromMinutes(30));
throw Oops.Oh(ErrorCodeEnum.D1000);
@@ -256,9 +256,9 @@ public class SysAuthService : IDynamicApiController, ITransient
// 更新用户登录信息
user.LastLoginIp = _httpContextAccessor.HttpContext.GetRemoteIpAddressToIPv4(true);
- (user.LastLoginAddress, double? longitude, double? latitude) = CommonUtil.GetIpAddress(user.LastLoginIp);
+ (user.LastLoginAddress, double? longitude, double? latitude) = CommonHelper.GetIpAddress(user.LastLoginIp);
user.LastLoginTime = DateTime.Now;
- user.LastLoginDevice = CommonUtil.GetClientDeviceInfo(_httpContextAccessor.HttpContext?.Request?.Headers?.UserAgent);
+ user.LastLoginDevice = CommonHelper.GetClientDeviceInfo(_httpContextAccessor.HttpContext?.Request?.Headers?.UserAgent);
await _sysUserRep.AsUpdateable(user).UpdateColumns(u => new
{
u.LastLoginIp,
@@ -409,7 +409,7 @@ public class SysAuthService : IDynamicApiController, ITransient
await Login(new LoginInput
{
Account = auth.UserName,
- Password = CryptogramUtil.SM2Encrypt(auth.Password),
+ Password = CryptogramHelper.SM2Encrypt(auth.Password),
TenantId = SqlSugarConst.DefaultTenantId
});
diff --git a/Admin.NET/Admin.NET.Core/Service/Auth/SysLdapService.cs b/Admin.NET/Admin.NET.Core/Service/Auth/SysLdapService.cs
index 482c9280..8a2d94b4 100644
--- a/Admin.NET/Admin.NET.Core/Service/Auth/SysLdapService.cs
+++ b/Admin.NET/Admin.NET.Core/Service/Auth/SysLdapService.cs
@@ -46,7 +46,7 @@ public class SysLdapService : IDynamicApiController, ITransient
public async Task Add(AddSysLdapInput input)
{
var entity = input.Adapt();
- entity.BindPass = CryptogramUtil.Encrypt(input.BindPass);
+ entity.BindPass = CryptogramHelper.Encrypt(input.BindPass);
await _sysLdapRep.InsertAsync(entity);
return entity.Id;
}
@@ -63,7 +63,7 @@ public class SysLdapService : IDynamicApiController, ITransient
var entity = input.Adapt();
if (!string.IsNullOrEmpty(input.BindPass) && input.BindPass.Length < 32)
{
- entity.BindPass = CryptogramUtil.Encrypt(input.BindPass); // 加密
+ entity.BindPass = CryptogramHelper.Encrypt(input.BindPass); // 加密
}
await _sysLdapRep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
@@ -119,7 +119,7 @@ public class SysLdapService : IDynamicApiController, ITransient
try
{
await ldapConn.ConnectAsync(sysLdap.Host, sysLdap.Port);
- string bindPass = CryptogramUtil.Decrypt(sysLdap.BindPass);
+ string bindPass = CryptogramHelper.Decrypt(sysLdap.BindPass);
await ldapConn.BindAsync(sysLdap.Version, sysLdap.BindDn, bindPass);
var ldapSearchResults = await ldapConn.SearchAsync(sysLdap.BaseDn, LdapConnection.ScopeSub, sysLdap.AuthFilter.Replace("%s", account), null, false);
string dn = string.Empty;
@@ -190,7 +190,7 @@ public class SysLdapService : IDynamicApiController, ITransient
try
{
await ldapConn.ConnectAsync(sysLdap.Host, sysLdap.Port);
- string bindPass = CryptogramUtil.Decrypt(sysLdap.BindPass);
+ string bindPass = CryptogramHelper.Decrypt(sysLdap.BindPass);
await ldapConn.BindAsync(sysLdap.Version, sysLdap.BindDn, bindPass);
var ldapSearchResults = await ldapConn.SearchAsync(sysLdap.BaseDn, LdapConnection.ScopeOne, "(objectClass=*)", null, false);
var userLdapList = new List();
@@ -335,7 +335,7 @@ public class SysLdapService : IDynamicApiController, ITransient
try
{
await ldapConn.ConnectAsync(sysLdap.Host, sysLdap.Port);
- string bindPass = CryptogramUtil.Decrypt(sysLdap.BindPass);
+ string bindPass = CryptogramHelper.Decrypt(sysLdap.BindPass);
await ldapConn.BindAsync(sysLdap.Version, sysLdap.BindDn, bindPass);
var ldapSearchResults = await ldapConn.SearchAsync(sysLdap.BaseDn, LdapConnection.ScopeOne, "(objectClass=*)", null, false);
var orgList = new List();
diff --git a/Admin.NET/Admin.NET.Core/Service/Cache/SysCacheService.cs b/Admin.NET/Admin.NET.Core/Service/Cache/SysCacheService.cs
index 7b63d839..1293b93d 100644
--- a/Admin.NET/Admin.NET.Core/Service/Cache/SysCacheService.cs
+++ b/Admin.NET/Admin.NET.Core/Service/Cache/SysCacheService.cs
@@ -248,7 +248,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
public async Task> GetListAsync(IEnumerable ids, Func, Task>> loadFromDb, bool cacheNull = true, TimeSpan? nullExpire = null) where T : class
{
var idList = ids.Distinct().ToList();
- if (idList.Count == 0) return new List();
+ if (idList.Count == 0) return [];
// 1. 批量获取缓存(保持同步,假设缓存操作快速)
var cachedItems = GetFromCache(idList);
@@ -296,7 +296,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
// 5. 按原始顺序返回
return idList.Select(id => resultDict.TryGetValue(id, out var item)
- ? (item == null ? null : item)
+ ? (item ?? null)
: null).ToList();
}
@@ -312,7 +312,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
public List GetList(IEnumerable ids, Func, List> loadFromDb, bool cacheNull = true, TimeSpan? nullExpire = null) where T : class
{
var idList = ids.Distinct().ToList();
- if (idList.Count == 0) return new List();
+ if (idList.Count == 0) return [];
// 1. 批量获取缓存
var cachedItems = GetFromCache(idList);
@@ -363,7 +363,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
// 5. 按原始顺序返回
return idList.Select(id => resultDict.TryGetValue(id, out var item)
- ? (item == null ? null : item)
+ ? (item ?? null)
: null).ToList();
}
@@ -379,11 +379,9 @@ public class SysCacheService : IDynamicApiController, ISingleton
[NonAction]
public List GetFromCache(List ids) where T : class
{
- if (ids == null || ids.Count == 0)
- return new List();
+ if (ids == null || ids.Count == 0) return [];
var keys = ids.Select(id => $"{_cacheOptions.Prefix}{id}").ToList();
-
if (_cacheProvider.Cache is FullRedis redis)
{
var result = redis.GetAll(keys);
diff --git a/Admin.NET/Admin.NET.Core/Service/CodeGen/CustomViewEngine.cs b/Admin.NET/Admin.NET.Core/Service/CodeGen/CustomViewEngine.cs
index 385aadb8..04831591 100644
--- a/Admin.NET/Admin.NET.Core/Service/CodeGen/CustomViewEngine.cs
+++ b/Admin.NET/Admin.NET.Core/Service/CodeGen/CustomViewEngine.cs
@@ -94,7 +94,7 @@ public class CustomViewEngine : ViewEngineModel
var config = App.GetOptions().ConnectionConfigs.FirstOrDefault(u => u.ConfigId.ToString() == ConfigId);
ColumnList = GetColumnListByTableName(tbName.ToString());
var col = ColumnList.Where(c => (config.DbSettings.EnableUnderLine
- ? CodeGenUtil.CamelColumnName(c.ColumnName, [])
+ ? CodeGenHelper.CamelColumnName(c.ColumnName, [])
: c.ColumnName) == colName.ToString()).FirstOrDefault();
return col.NetType;
}
@@ -122,7 +122,7 @@ public class CustomViewEngine : ViewEngineModel
ColumnName = u.DbColumnName,
ColumnKey = u.IsPrimarykey.ToString(),
DataType = u.DataType.ToString(),
- NetType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType),
+ NetType = CodeGenHelper.ConvertDataType(u, provider.CurrentConnectionConfig.DbType),
ColumnComment = u.ColumnDescription
}).ToList();
}
diff --git a/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/TableOutput.cs b/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/TableOutput.cs
index 4206e55e..fb053e64 100644
--- a/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/TableOutput.cs
+++ b/Admin.NET/Admin.NET.Core/Service/CodeGen/Dto/TableOutput.cs
@@ -44,7 +44,7 @@ public class TableOutput
///
/// 表字段个数
///
- public int ColumnCount { get; set; }
+ public int ColumnCount { get; set; }
///
/// 程序集名称
diff --git a/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs b/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs
index 8bbc1b53..c6391581 100644
--- a/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs
+++ b/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs
@@ -73,7 +73,7 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
IsPrimarykey = u.IsPrimarykey,
IsNullable = u.IsNullable,
ColumnKey = u.IsPrimarykey.ToString(),
- NetType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType),
+ NetType = CodeGenHelper.ConvertDataType(u, provider.CurrentConnectionConfig.DbType),
DataType = u.DataType,
ColumnComment = string.IsNullOrWhiteSpace(u.ColumnDescription) ? u.DbColumnName : u.ColumnDescription,
DefaultValue = u.DefaultValue,
@@ -87,7 +87,7 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
// 先找自定义字段名的,如果找不到就再找自动生成字段名的(并且过滤掉没有SugarColumn的属性)
var propertyInfo = entityProperties.FirstOrDefault(u => (u.GetCustomAttribute()?.ColumnName ?? "").ToLower() == columnOutput.ColumnName.ToLower()) ??
entityProperties.FirstOrDefault(u => u.GetCustomAttribute() != null && u.Name.ToLower() == (config.DbSettings.EnableUnderLine
- ? CodeGenUtil.CamelColumnName(columnOutput.ColumnName, entityBasePropertyNames).ToLower()
+ ? CodeGenHelper.CamelColumnName(columnOutput.ColumnName, entityBasePropertyNames).ToLower()
: columnOutput.ColumnName.ToLower()));
if (propertyInfo != null)
{
@@ -265,7 +265,7 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
YesOrNo = YesNoEnum.N.ToString();
}
- if (CodeGenUtil.IsCommonColumn(tableColumn.PropertyName))
+ if (CodeGenHelper.IsCommonColumn(tableColumn.PropertyName))
{
codeGenConfig.WhetherCommon = YesNoEnum.Y.ToString();
YesOrNo = YesNoEnum.N.ToString();
@@ -313,7 +313,7 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
codeGenConfig.ColumnKey = tableColumn.ColumnKey;
codeGenConfig.DataType = tableColumn.DataType;
- codeGenConfig.EffectType = CodeGenUtil.DataTypeToEff(codeGenConfig.NetType);
+ codeGenConfig.EffectType = CodeGenHelper.DataTypeToEff(codeGenConfig.NetType);
codeGenConfig.QueryType = GetDefaultQueryType(codeGenConfig); // QueryTypeEnum.eq.ToString();
codeGenConfig.OrderNo = orderNo;
codeGenConfig.DefaultValue = GetDefaultValue(tableColumn.DefaultValue);
diff --git a/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs b/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs
index 7b75f0d6..a8d89ffe 100644
--- a/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs
+++ b/Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs
@@ -241,10 +241,10 @@ public class SysCodeGenService : IDynamicApiController, ITransient
// 按原始类型的顺序获取所有实体类型属性(不包含导航属性,会返回null)
var columnList = provider.DbMaintenance.GetColumnInfosByTableName(entityType.Name).Select(u => new ColumnOuput
{
- ColumnName = config!.DbSettings.EnableUnderLine ? CodeGenUtil.CamelColumnName(u.DbColumnName, entityBasePropertyNames) : u.DbColumnName,
+ ColumnName = config!.DbSettings.EnableUnderLine ? CodeGenHelper.CamelColumnName(u.DbColumnName, entityBasePropertyNames) : u.DbColumnName,
ColumnKey = u.IsPrimarykey.ToString(),
DataType = u.DataType.ToString(),
- NetType = CodeGenUtil.ConvertDataType(u, provider.CurrentConnectionConfig.DbType),
+ NetType = CodeGenHelper.ConvertDataType(u, provider.CurrentConnectionConfig.DbType),
ColumnComment = u.ColumnDescription
}).ToList();
@@ -265,7 +265,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
string GetRealColumnName(string name)
{
if (string.IsNullOrWhiteSpace(name)) return null;
- string realName = config!.DbSettings.EnableUnderLine ? CodeGenUtil.CamelColumnName(name, entityBasePropertyNames) : name;
+ string realName = config!.DbSettings.EnableUnderLine ? CodeGenHelper.CamelColumnName(name, entityBasePropertyNames) : name;
if (config.DbType == DbType.PostgreSQL) realName = realName.ToLower();
return realName;
}
diff --git a/Admin.NET/Admin.NET.Core/Service/Common/SysCommonService.cs b/Admin.NET/Admin.NET.Core/Service/Common/SysCommonService.cs
index e416dbb9..67b574e1 100644
--- a/Admin.NET/Admin.NET.Core/Service/Common/SysCommonService.cs
+++ b/Admin.NET/Admin.NET.Core/Service/Common/SysCommonService.cs
@@ -35,7 +35,7 @@ public class SysCommonService : IDynamicApiController, ITransient
[DisplayName("获取国密公钥私钥对")]
public SmKeyPairOutput GetSmKeyPair()
{
- return CryptogramUtil.GetSmKeyPair();
+ return CryptogramHelper.GetSmKeyPair();
}
///
@@ -58,7 +58,7 @@ public class SysCommonService : IDynamicApiController, ITransient
[DisplayName("国密SM2加密字符串")]
public string SM2Encrypt([Required] string plainText)
{
- return CryptogramUtil.SM2Encrypt(plainText);
+ return CryptogramHelper.SM2Encrypt(plainText);
}
///
@@ -69,7 +69,7 @@ public class SysCommonService : IDynamicApiController, ITransient
[DisplayName("国密SM2解密字符串")]
public string SM2Decrypt([Required] string cipherText)
{
- return CryptogramUtil.SM2Decrypt(cipherText);
+ return CryptogramHelper.SM2Decrypt(cipherText);
}
///
@@ -185,7 +185,8 @@ public class SysCommonService : IDynamicApiController, ITransient
///
/// 生成所有移动端接口文件 🔖
///
- ///
+ ///
+ ///
[HttpGet]
[DisplayName("生成所有移动端接口文件")]
public void GenerateAppApi([FromQuery] string groupName = "", [FromQuery] bool isAppApi = true)
diff --git a/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbColumnInput.cs b/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbColumnInput.cs
index b3f20c7b..172e93fd 100644
--- a/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbColumnInput.cs
+++ b/Admin.NET/Admin.NET.Core/Service/DataBase/Dto/DbColumnInput.cs
@@ -27,6 +27,8 @@ public class DbColumnInput
public int IsPrimarykey { get; set; }
public int DecimalDigits { get; set; }
+
+ public string DefaultValue { get; set; }
}
public class UpdateDbColumnInput
@@ -40,6 +42,8 @@ public class UpdateDbColumnInput
public string OldColumnName { get; set; }
public string Description { get; set; }
+
+ public string DefaultValue { get; set; }
}
public class DeleteDbColumnInput
@@ -49,4 +53,27 @@ public class DeleteDbColumnInput
public string TableName { get; set; }
public string DbColumnName { get; set; }
+}
+
+public class MoveDbColumnInput
+{
+ ///
+ /// 数据库配置ID
+ ///
+ public string ConfigId { get; set; }
+
+ ///
+ /// 目标表名
+ ///
+ public string TableName { get; set; }
+
+ ///
+ ///要移动的列名
+ ///
+ public string ColumnName { get; set; }
+
+ ///
+ /// 移动到该列后方(为空时移动到首列)
+ ///
+ public string AfterColumnName { get; set; }
}
\ No newline at end of file
diff --git a/Admin.NET/Admin.NET.Core/Service/DataBase/SysDatabaseService.cs b/Admin.NET/Admin.NET.Core/Service/DataBase/SysDatabaseService.cs
index 8569c946..30520352 100644
--- a/Admin.NET/Admin.NET.Core/Service/DataBase/SysDatabaseService.cs
+++ b/Admin.NET/Admin.NET.Core/Service/DataBase/SysDatabaseService.cs
@@ -122,10 +122,9 @@ public class SysDatabaseService : IDynamicApiController, ITransient
[DisplayName("获取字段列表")]
public List GetColumnList(string tableName, string configId = SqlSugarConst.MainConfigId)
{
- var db = _db.AsTenant().GetConnectionScope(configId);
- if (string.IsNullOrWhiteSpace(tableName))
- return new List();
+ if (string.IsNullOrWhiteSpace(tableName)) return [];
+ var db = _db.AsTenant().GetConnectionScope(configId);
return db.DbMaintenance.GetColumnInfosByTableName(tableName, false).Adapt>();
}
@@ -162,6 +161,9 @@ public class SysDatabaseService : IDynamicApiController, ITransient
};
var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
db.DbMaintenance.AddColumn(input.TableName, column);
+ // 添加默认值
+ if (!string.IsNullOrWhiteSpace(input.DefaultValue))
+ db.DbMaintenance.AddDefaultValue(input.TableName, column.DbColumnName, input.DefaultValue);
db.DbMaintenance.AddColumnRemark(input.DbColumnName, input.TableName, input.ColumnDescription);
if (column.IsPrimarykey)
db.DbMaintenance.AddPrimaryKey(input.TableName, input.DbColumnName);
@@ -189,11 +191,88 @@ public class SysDatabaseService : IDynamicApiController, ITransient
{
var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
db.DbMaintenance.RenameColumn(input.TableName, input.OldColumnName, input.ColumnName);
+ if (!string.IsNullOrWhiteSpace(input.DefaultValue))
+ db.DbMaintenance.AddDefaultValue(input.TableName, input.ColumnName, input.DefaultValue);
if (db.DbMaintenance.IsAnyColumnRemark(input.ColumnName, input.TableName))
db.DbMaintenance.DeleteColumnRemark(input.ColumnName, input.TableName);
db.DbMaintenance.AddColumnRemark(input.ColumnName, input.TableName, string.IsNullOrWhiteSpace(input.Description) ? input.ColumnName : input.Description);
}
+ ///
+ /// 移动列顺序 🔖
+ ///
+ ///
+ [DisplayName("移动列顺序")]
+ public void MoveColumn(MoveDbColumnInput input)
+ {
+ var db = _db.AsTenant().GetConnectionScope(input.ConfigId);
+ var dbMaintenance = db.DbMaintenance;
+
+ var columns = dbMaintenance.GetColumnInfosByTableName(input.TableName, false);
+ var targetColumn = columns.FirstOrDefault(u => u.DbColumnName.Equals(input.ColumnName, StringComparison.OrdinalIgnoreCase)) ?? throw new Exception($"列 {input.ColumnName} 在表 {input.TableName} 中不存在");
+
+ var dbType = db.CurrentConnectionConfig.DbType;
+ switch (dbType)
+ {
+ case SqlSugar.DbType.MySql:
+ MoveColumnInMySQL(db, input.TableName, input.ColumnName, input.AfterColumnName);
+ break;
+
+ default:
+ throw new NotSupportedException($"暂不支持 {dbType} 数据库的列移动操作");
+ }
+ }
+
+ ///
+ /// 获取列定义
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ private string GetColumnDefinitionInMySQL(ISqlSugarClient db, string tableName, string columnName, bool noDefault = false)
+ {
+ var columnDef = db.Ado.SqlQuery($"SHOW FULL COLUMNS FROM `{tableName}` WHERE Field = '{columnName}'").FirstOrDefault() ?? throw new Exception($"Column {columnName} not found");
+
+ var definition = new StringBuilder();
+ definition.Append($"`{columnName}` "); // 列名
+ definition.Append($"{columnDef.Type} "); // 数据类型
+
+ // 处理约束条件
+ definition.Append(columnDef.Null == "YES" ? "NULL " : "NOT NULL ");
+ if (columnDef.Default != null && !noDefault)
+ definition.Append($"DEFAULT '{columnDef.Default}' ");
+ if (!string.IsNullOrEmpty(columnDef.Extra))
+ definition.Append($"{columnDef.Extra} ");
+ if (!string.IsNullOrEmpty(columnDef.Comment))
+ definition.Append($"COMMENT '{columnDef.Comment.Replace("'", "''")}'");
+
+ return definition.ToString();
+ }
+
+ ///
+ /// MySQL 列移动实现
+ ///
+ ///
+ ///
+ ///
+ ///
+ private void MoveColumnInMySQL(ISqlSugarClient db, string tableName, string columnName, string afterColumnName)
+ {
+ var definition = GetColumnDefinitionInMySQL(db, tableName, columnName);
+ var sql = new StringBuilder();
+ sql.Append($"ALTER TABLE `{tableName}` MODIFY COLUMN {definition}");
+
+ if (string.IsNullOrEmpty(afterColumnName))
+ sql.Append(" FIRST");
+ else
+ sql.Append($" AFTER `{afterColumnName}`");
+
+ db.Ado.ExecuteCommand(sql.ToString());
+ }
+
///
/// 获取表列表 🔖
///
@@ -236,6 +315,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
IsNullable = u.IsNullable == 1,
DecimalDigits = u.DecimalDigits,
ColumnDescription = u.ColumnDescription,
+ DefaultValue = u.DefaultValue,
});
});
db.CodeFirst.InitTables(typeBuilder.BuilderType());
@@ -323,9 +403,9 @@ public class SysDatabaseService : IDynamicApiController, ITransient
var config = App.GetOptions().ConnectionConfigs.FirstOrDefault(u => u.ConfigId.ToString() == input.ConfigId);
input.Position = string.IsNullOrWhiteSpace(input.Position) ? "Admin.NET.Application" : input.Position;
input.EntityName = string.IsNullOrWhiteSpace(input.EntityName)
- ? (config.DbSettings.EnableUnderLine ? CodeGenUtil.CamelColumnName(input.TableName, null) : input.TableName)
+ ? (config.DbSettings.EnableUnderLine ? CodeGenHelper.CamelColumnName(input.TableName, null) : input.TableName)
: input.EntityName;
- string[] dbColumnNames = Array.Empty();
+ string[] dbColumnNames = [];
// Entity.cs.vm中是允许创建没有基类的实体的,所以这里也要做出相同的判断
if (!string.IsNullOrWhiteSpace(input.BaseClassName))
{
@@ -338,8 +418,12 @@ public class SysDatabaseService : IDynamicApiController, ITransient
var dbColumnInfos = db.DbMaintenance.GetColumnInfosByTableName(input.TableName, false);
dbColumnInfos.ForEach(u =>
{
- u.PropertyName = config.DbSettings.EnableUnderLine ? CodeGenUtil.CamelColumnName(u.DbColumnName, dbColumnNames) : u.DbColumnName; // 转下划线后的列名需要再转回来
- u.DataType = CodeGenUtil.ConvertDataType(u, config.DbType);
+ // 禁止字段全是大写的
+ if (u.DbColumnName.ToUpper() == u.DbColumnName)
+ throw new Exception($"字段命名规范错误:{u.DbColumnName} 字段全是大写字母,请用大驼峰式命名规范!");
+
+ u.PropertyName = config.DbSettings.EnableUnderLine ? CodeGenHelper.CamelColumnName(u.DbColumnName, dbColumnNames) : u.DbColumnName; // 转下划线后的列名需要再转回来
+ u.DataType = CodeGenHelper.ConvertDataType(u, config.DbType);
});
if (_codeGenOptions.BaseEntityNames.Contains(input.BaseClassName, StringComparer.OrdinalIgnoreCase))
dbColumnInfos = dbColumnInfos.Where(u => !dbColumnNames.Contains(u.PropertyName, StringComparer.OrdinalIgnoreCase)).ToList();
@@ -431,7 +515,7 @@ public class SysDatabaseService : IDynamicApiController, ITransient
var seedData = ((IEnumerable)hasDataMethod?.Invoke(instance, null))?.Cast