diff --git a/.idea/.idea.NPin/.idea/.gitignore b/.idea/.idea.NPin/.idea/.gitignore
new file mode 100644
index 0000000..6ea7a0a
--- /dev/null
+++ b/.idea/.idea.NPin/.idea/.gitignore
@@ -0,0 +1,13 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Rider ignored files
+/contentModel.xml
+/.idea.NPin.iml
+/modules.xml
+/projectSettingsUpdater.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/.idea.NPin/.idea/encodings.xml b/.idea/.idea.NPin/.idea/encodings.xml
new file mode 100644
index 0000000..df87cf9
--- /dev/null
+++ b/.idea/.idea.NPin/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.NPin/.idea/indexLayout.xml b/.idea/.idea.NPin/.idea/indexLayout.xml
new file mode 100644
index 0000000..7b08163
--- /dev/null
+++ b/.idea/.idea.NPin/.idea/indexLayout.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.NPin/.idea/vcs.xml b/.idea/.idea.NPin/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/.idea.NPin/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Framework/NPin.Framework.Core/Enums/FileTypeEnum.cs b/Framework/NPin.Framework.Core/Enums/FileTypeEnum.cs
new file mode 100644
index 0000000..dac82cb
--- /dev/null
+++ b/Framework/NPin.Framework.Core/Enums/FileTypeEnum.cs
@@ -0,0 +1,32 @@
+namespace NPin.Framework.Core.Enums;
+
+///
+/// 文件类型
+///
+public enum FileTypeEnum
+{
+ ///
+ /// 普通文件
+ ///
+ File,
+
+ ///
+ /// 图片
+ ///
+ Image,
+
+ ///
+ /// 缩略图
+ ///
+ Thumbnail,
+
+ ///
+ /// Excel
+ ///
+ Excel,
+
+ ///
+ /// 临时文件
+ ///
+ Temp
+}
\ No newline at end of file
diff --git a/Framework/NPin.Framework.Core/Enums/OrderByEnum.cs b/Framework/NPin.Framework.Core/Enums/OrderByEnum.cs
new file mode 100644
index 0000000..681701e
--- /dev/null
+++ b/Framework/NPin.Framework.Core/Enums/OrderByEnum.cs
@@ -0,0 +1,14 @@
+namespace NPin.Framework.Core.Enums;
+
+public enum OrderByEnum
+{
+ ///
+ /// 升序
+ ///
+ Asc,
+
+ ///
+ /// 降序
+ ///
+ Desc,
+}
\ No newline at end of file
diff --git a/Framework/NPin.Framework.Core/Extensions/HttpContextExtensions.cs b/Framework/NPin.Framework.Core/Extensions/HttpContextExtensions.cs
new file mode 100644
index 0000000..97329f1
--- /dev/null
+++ b/Framework/NPin.Framework.Core/Extensions/HttpContextExtensions.cs
@@ -0,0 +1,6 @@
+namespace NPin.Framework.Core.Extensions;
+
+public static class HttpContextExtensions
+{
+ // public static void FileInlineHandle(this HttpContext)
+}
\ No newline at end of file
diff --git a/Framework/NPin.Framework.Core/Helper/ReflectHelper.cs b/Framework/NPin.Framework.Core/Helper/ReflectHelper.cs
new file mode 100644
index 0000000..0f47b84
--- /dev/null
+++ b/Framework/NPin.Framework.Core/Helper/ReflectHelper.cs
@@ -0,0 +1,57 @@
+namespace NPin.Framework.Core.Helper;
+
+public static class ReflectHelper
+{
+ ///
+ /// 反射获取对象属性值(string)
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static string? GetModelValue(string fieldName, object obj)
+ {
+ try
+ {
+ var typ = obj.GetType();
+ object o = typ.GetProperty(fieldName).GetValue(obj, null);
+ if (o == null)
+ {
+ return null;
+ }
+
+ var value = Convert.ToString(o);
+ if (string.IsNullOrEmpty(value))
+ {
+ return null;
+ }
+
+ return value;
+ }
+ catch (Exception e)
+ {
+ throw e;
+ }
+ }
+
+ ///
+ /// 反射设置对象属性值
+ ///
+ ///
+ ///
+ ///
+ ///
+ public static bool SetModelValue(string fieldName, object value, object obj)
+ {
+ try
+ {
+ var typ = obj.GetType();
+ typ.GetProperty(fieldName)?.SetValue(obj, value, null);
+ return true;
+ }
+ catch (Exception e)
+ {
+ throw e;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Framework/NPin.Framework.Core/NPin.Framework.Core.csproj b/Framework/NPin.Framework.Core/NPin.Framework.Core.csproj
new file mode 100644
index 0000000..3cf2969
--- /dev/null
+++ b/Framework/NPin.Framework.Core/NPin.Framework.Core.csproj
@@ -0,0 +1,19 @@
+
+
+
+ net8.0
+ enable
+ enable
+ Lan.Framework.Core
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Framework/NPin.Framework.Core/NPinFrameworkCoreModule.cs b/Framework/NPin.Framework.Core/NPinFrameworkCoreModule.cs
new file mode 100644
index 0000000..c66e187
--- /dev/null
+++ b/Framework/NPin.Framework.Core/NPinFrameworkCoreModule.cs
@@ -0,0 +1,7 @@
+using Volo.Abp.Modularity;
+
+namespace NPin.Framework.Core;
+
+public class NPinFrameworkCoreModule : AbpModule
+{
+}
diff --git a/Framework/NPin.Framework.Mapster/MapsterAutoObjectMappingProvider.cs b/Framework/NPin.Framework.Mapster/MapsterAutoObjectMappingProvider.cs
new file mode 100644
index 0000000..adc1265
--- /dev/null
+++ b/Framework/NPin.Framework.Mapster/MapsterAutoObjectMappingProvider.cs
@@ -0,0 +1,18 @@
+using Mapster;
+using Volo.Abp.ObjectMapping;
+
+namespace NPin.Framework.Mapster;
+
+public class MapsterAutoObjectMappingProvider: IAutoObjectMappingProvider
+{
+ public TDestination Map(object source)
+ {
+ // var sss = typeof(TDestination).Name;
+ return source.Adapt();
+ }
+
+ public TDestination Map(TSource source, TDestination destination)
+ {
+ return source.Adapt(destination);
+ }
+}
\ No newline at end of file
diff --git a/Framework/NPin.Framework.Mapster/MapsterObjectMapper.cs b/Framework/NPin.Framework.Mapster/MapsterObjectMapper.cs
new file mode 100644
index 0000000..31a064d
--- /dev/null
+++ b/Framework/NPin.Framework.Mapster/MapsterObjectMapper.cs
@@ -0,0 +1,18 @@
+using Volo.Abp.ObjectMapping;
+
+namespace NPin.Framework.Mapster;
+
+public class MapsterObjectMapper : IObjectMapper
+{
+ public IAutoObjectMappingProvider AutoObjectMappingProvider => throw new NotImplementedException();
+
+ public TDestination Map(TSource source)
+ {
+ throw new NotImplementedException();
+ }
+
+ public TDestination Map(TSource source, TDestination destination)
+ {
+ throw new NotImplementedException();
+ }
+}
\ No newline at end of file
diff --git a/Framework/NPin.Framework.Mapster/NPin.Framework.Mapster.csproj b/Framework/NPin.Framework.Mapster/NPin.Framework.Mapster.csproj
new file mode 100644
index 0000000..489f7d3
--- /dev/null
+++ b/Framework/NPin.Framework.Mapster/NPin.Framework.Mapster.csproj
@@ -0,0 +1,18 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Framework/NPin.Framework.Mapster/NPinFrameworkMapsterModule.cs b/Framework/NPin.Framework.Mapster/NPinFrameworkMapsterModule.cs
new file mode 100644
index 0000000..3e83c80
--- /dev/null
+++ b/Framework/NPin.Framework.Mapster/NPinFrameworkMapsterModule.cs
@@ -0,0 +1,16 @@
+using Microsoft.Extensions.DependencyInjection;
+using NPin.Framework.Core;
+using Volo.Abp.Modularity;
+using Volo.Abp.ObjectMapping;
+
+namespace NPin.Framework.Mapster;
+
+[DependsOn(typeof(NPinFrameworkCoreModule), typeof(AbpObjectMappingModule))]
+public class NPinFrameworkMapsterModule : AbpModule
+{
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ // 注入 MapsterAutoObjectMappingProvider
+ context.Services.AddTransient();
+ }
+}
\ No newline at end of file
diff --git a/Framework/NPin.Framework.SqlSugarCore.Abstractions/DbConnOptions.cs b/Framework/NPin.Framework.SqlSugarCore.Abstractions/DbConnOptions.cs
new file mode 100644
index 0000000..9e17cd0
--- /dev/null
+++ b/Framework/NPin.Framework.SqlSugarCore.Abstractions/DbConnOptions.cs
@@ -0,0 +1,105 @@
+using SqlSugar;
+
+namespace NPin.Framework.SqlSugarCore.Abstractions;
+
+public class DbConnOptions
+{
+ ///
+ /// 连接字符串 必填
+ ///
+ public string? Url { get; set; }
+
+ ///
+ /// 数据库类型
+ ///
+ public DbType? DbType { get; set; }
+
+ ///
+ /// 开启种子数据
+ ///
+ public bool EnabledDbSeed { get; set; } = false;
+
+ ///
+ /// 开启 CodeFirst 自动化表结构
+ ///
+ public bool EnabledCodeFirst { get; set; } = false;
+
+ ///
+ /// 开启sql日志
+ ///
+ public bool EnabledSqlLog { get; set; } = true;
+
+ ///
+ /// 实体程序集
+ ///
+ public List? EntityAssembly { get; set; }
+
+ ///
+ /// 开启读写分离
+ ///
+ public bool EnabledReadWrite { get; set; } = false;
+
+ ///
+ /// 读写分离
+ ///
+ public List? ReadUrl { get; set; }
+
+ ///
+ /// 开启Saas多租户
+ ///
+ public bool EnabledSaasMultiTenancy { get; set; } = false;
+
+
+ ///
+ /// 默认租户库连接,如果不填,那就是默认库的地址
+ ///
+ public string? MasterSaasMultiTenancyUrl { get; set; }
+
+
+ ///
+ /// Saas租户连接
+ ///
+ public List? SaasMultiTenancy { get; set; }
+
+ public static string MasterTenantDbDefaultName = "Master";
+ public static string TenantDbDefaultName = "Default";
+
+ public SaasMultiTenancyOptions GetDefaultSaasMultiTenancy()
+ {
+ return new SaasMultiTenancyOptions { Name = TenantDbDefaultName, Url = Url };
+ }
+
+ public SaasMultiTenancyOptions? GetDefaultMasterSaasMultiTenancy()
+ {
+ if (EnabledSaasMultiTenancy == false)
+ {
+ return null;
+ }
+
+ if (string.IsNullOrEmpty(MasterSaasMultiTenancyUrl))
+ {
+ return new SaasMultiTenancyOptions { Name = MasterTenantDbDefaultName, Url = Url };
+ }
+ else
+ {
+ return new SaasMultiTenancyOptions()
+ {
+ Name = MasterTenantDbDefaultName,
+ Url = MasterSaasMultiTenancyUrl
+ };
+ }
+ }
+}
+
+public class SaasMultiTenancyOptions
+{
+ ///
+ /// 租户名称标识
+ ///
+ public string Name { get; set; }
+
+ ///
+ /// 连接Url
+ ///
+ public string Url { get; set; }
+}
\ No newline at end of file
diff --git a/Framework/NPin.Framework.SqlSugarCore.Abstractions/ISqlSugarDbConnectionCreator.cs b/Framework/NPin.Framework.SqlSugarCore.Abstractions/ISqlSugarDbConnectionCreator.cs
new file mode 100644
index 0000000..3e35021
--- /dev/null
+++ b/Framework/NPin.Framework.SqlSugarCore.Abstractions/ISqlSugarDbConnectionCreator.cs
@@ -0,0 +1,19 @@
+using System.Reflection;
+using SqlSugar;
+
+namespace NPin.Framework.SqlSugarCore.Abstractions;
+
+public interface ISqlSugarDbConnectionCreator
+{
+ DbConnOptions Options { get; }
+
+ Action OnSqlSugarClientConfig { get; set; }
+ Action