南方网景信息管理系统(SnIMS)技术分析报告
发布时间:2026-03-28
以下内容由LLM大模型详细审阅整个项目源代码后,给出的技术分析报告:
SnIMS 框架核心代码结构分析报告
一、框架概述
SnIMS (SouthNet Information Management System) 是一个基于 .NET 的信息管理系统/数据管理系统框架。该框架从 .NET Framework 4.8 升级而来,现已支持 .NET 4.8 和 .NET 8.0 双框架,实现了跨平台(Windows/Linux)和跨数据库的支持。
官网: www.veelink.net
二、项目结构
e:\ProjectBak\AI Coding\Demo2├── SnIMS.Common/ # 公共工具类库
├── SnIMS.Model/ # 实体模型层(含 ORM 导航属性)
├── SnIMS.IDAL/ # 数据访问层接口
├── SnIMS.Factory/ # 工厂类(依赖注入)
├── SnIMS.BLL/ # 业务逻辑层
├── SnIMS.Engine/ # 系统数据引擎(核心处理)
├── SnIMS.Component/ # .NET 8.0 前端组件(TagHelper)
├── SnIMS.Control/ # .NET 4.8 前端控件(WebControl)
├── SnIMS.Service/ # .NET 8.0 Web 前端项目
├── SnIMS.Web/ # .NET 4.8 Web 前端项目
├── SnIMS.Code/ # 代码生成器
├── SnIMS.SqlSugarDAL/ # SqlSugar ORM 数据访问层
├── SnIMS.SqlserverDAL/ # SQL Server 原生 DAL
├── SnIMS.MySqlDAL/ # MySQL 原生 DAL
├── SnIMS.OracleDAL/ # Oracle 原生 DAL
├── SnIMS.PostgreSqlDAL/ # PostgreSQL 原生 DAL
├── SnIMS.DmdbDAL/ # 达梦数据库 DAL
├── SnIMS.SQLiteDAL/ # SQLite 原生 DAL
├── SnIMS.OledbDAL/ # OleDb 通用 DAL
├── SnIMS.ApiDAL/ # API 接口 DAL(远程数据访问)
├── SnIMS.EntityFrameworkDAL/ # EF ORM(已弃用)
├── SnIMS.Tool/ # 工具类
└── SnIMS.Update/ # 自动升级应用
三、各层详细分析
1. SnIMS.Common - 公共工具类库
位置: e:\ProjectBak\AI Coding\Demo2\SnIMS.Common\
这是框架的核心基础类库,包含以下模块:
1.1 DataHelper(数据转换)
-
DataCommon.cs: 实体对象操作工具
-
CopyToModel<T>(): 实体复制 -
FetchToModel<TSource, TTarget>(): 实体间属性提取 -
FetchToDataRow<T>(): 实体填充 DataRow -
ModelToExpression<T>(): 实体转 LINQ 表达式 -
SetProperty<T>(): 动态设置属性值
-
-
DataTrans.cs: 数据类型转换(DataTable/List/Json/实体互转)
-
DataTableToList<T>(): DataTable 转 List -
ListToDataTable<T>(): List 转 DataTable -
DataTableToJson(): DataTable 转 JSON -
ModelToString(): 实体转 JSON 字符串
-
-
JsonData.cs: 自定义 JSON 数据处理类(类似 LitJson)
1.2 DbHelper(数据库辅助)
-
SqlHelper.cs: SQL Server 原生 ADO.NET 操作类
- 支持事务、存储过程、批量操作
- 包含调试日志和错误日志功能
-
SqlSugarHelper.cs: SqlSugar ORM 封装
- 支持多数据库(SQL Server/MySQL/Oracle/PostgreSQL/达梦/SQLite)
-
提供
Queryable<T>(),Insertable<T>(),Updateable<T>(),Deleteable<T>()等链式操作
-
ApiHelper.cs: API 远程数据访问
- 支持 Token 认证、签名验证
- 提供统一的 API 调用接口
-
其他数据库辅助类:
-
MySqlHelper.cs,OracleHelper.cs,OleDbHelper.cs,RedisHelper.cs
-
1.3 StringHelper(字符串处理)
-
StringHandle.cs: 字符串扩展方法
-
ToStr(),ToInt(),ToDateTime(),ToJsonData()等类型转换 -
IsEmpty(),NotEmpty()空值判断 -
AddString(),DelString()字符串集合操作
-
-
Filter.cs: 数据过滤和转换
-
HTML 标签过滤 (
HtmlEnc(),HtmlCheck()) - 中文数字转换
- 类型安全转换
-
HTML 标签过滤 (
-
Validator.cs: 数据验证
- 邮箱、IP、密码强度验证
- 中文字符检测
1.4 SecurityHelper(安全加密)
-
EncryptUtils.cs: 综合加密工具
- Base64、MD5、DES、3DES、RSA 加密解密
- 支持 Java/.NET 密钥格式转换
-
AuthCode.cs: 双因素认证(Google Authenticator)
- 生成二维码、验证动态码
-
其他:
DESEncryp.cs,MD5.cs
1.5 PageHelper(页面/HTTP 处理)
-
HttpHandle.cs: HTTP 请求处理
- GET/POST/PUT/DELETE/DOWNLOAD
- 支持文件上传下载
- 异步请求支持
-
WebContext.cs: Web 上下文封装
-
RequestHandle.cs: 请求处理
-
HttpServer.cs: HTTP 服务器
1.6 StatHelper(统计/缓存)
-
DataCache.cs: 数据缓存(支持 .NET 4.8 和 8.0)
-
基于
HttpRuntime.Cache(.NET 4.8) 或IMemoryCache(.NET 8.0) - 支持模糊搜索缓存键
-
基于
-
DbCache.cs: 数据库缓存层
1.7 FileHelper(文件操作)
-
FileControl.cs: 文件/文件夹操作
- 创建、删除、复制、移动
- 文件编码检测
- 文件搜索
-
ConfigManager.cs: 配置文件管理
-
Zip.cs: 压缩/解压
-
FtpHelper.cs: FTP 操作
1.8 其他模块
- DocumentHelper/ExcelOperate.cs: Excel 操作
- EmailHelper/Smtp.cs: 邮件发送
- JsHelper/: JSON 序列化(LitJson 风格)
- LogHelper/Debug.cs: 日志记录
2. SnIMS.Model - 实体模型层
位置: e:\ProjectBak\AI Coding\Demo2\SnIMS.Model\
实体类使用 SqlSugar ORM 特性标注,支持导航属性。
实体类特性示例(以 Member.cs 为例):
[Table("Member")]
public class Member
{
[Description("ID")]
[Key]
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int? MemberID { get; set; }
[Description("名字")]
[StringLength(50)]
public string Name { get; set; }
// 跨表文本字段(自动填充关联表名称)
[SugarColumn(IsIgnore = true)]
[Description("用户组_文本")]
public string MemberClassID_MemberClass_Name { get; set; }
// ORM 导航属性(多对一)
[Navigate(NavigateType.ManyToOne, nameof(MemberClassID), nameof(SnIMS.Model.MemberClass.MemberClassID))]
public virtual MemberClass MemberClassID_MemberClass { get; set; }
// 跨表查询配置
[JoinTable("MemberClass:MemberClassID:Name")]
public int? MemberClassID { get; set; }
}
特点:
-
使用
[Table],[SugarColumn],[Navigate],[JoinTable]等特性 - 支持一对多、多对一导航
- 自动生成跨表文本字段
3. SnIMS.IDAL - 数据访问层接口
位置: e:\ProjectBak\AI Coding\Demo2\SnIMS.IDAL\
定义数据访问的标准接口,实现数据库无关性。
接口示例(IMember.cs):
public interface IMember
{
int GetMaxId();
bool Exists(SnIMS.Model.Member model);
int Add(SnIMS.Model.Member model);
int Update(SnIMS.Model.Member model);
int Update(SnIMS.Model.Member mod_update, string Include, SnIMS.Model.Member mod_search);
int Delete(string Set, string Value);
int Delete(SnIMS.Model.Member model, string Include);
SnIMS.Model.Member GetModel(int MemberID);
string GetString(string get, string set, string value);
DataTable GetList(SnIMS.Model.Member model, int? top, string key, string include, string order,
int? PageIndex, int? PageSize, string Selects, string Joins);
int GetCount(SnIMS.Model.Member model, string Key, string Include, string Joins, string Selects);
object GetFunctResult(string FuncName, string ParaValue, SnIMS.Model.Member model,
string Key, string Include, string Joins, string Selects, bool isSingle);
}
I_SqlSugar.cs - ORM 通用接口:
public interface I_SqlSugar : IDisposable
{
IQueryable<T> GetList<T>() where T : class, new();
}
4. SnIMS.Factory - 工厂层
位置: e:\ProjectBak\AI Coding\Demo2\SnIMS.Factory\
通过反射动态创建 DAL 实例,实现依赖注入。
工厂类示例(FMember.cs):
public class FMember
{
public static SnIMS.IDAL.IMember CreateMember()
{
string CacheKey = "Member";
object objType = DataAccess.CreateObject(CacheKey);
return (SnIMS.IDAL.IMember)objType;
}
}
F_SqlSugar.cs:
public static class F_SqlSugar
{
public static SnIMS.IDAL.I_SqlSugar CreateSqlSugar()
{
// 根据配置动态选择 SqlSugarDAL 或 Common.DbHelper.SqlSugarHelper
object objType = DataAccess.CreateObject("SnIMS.Common.DbHelper", "SqlSugarHelper");
return (SnIMS.IDAL.I_SqlSugar)objType;
}
}
5. SnIMS.BLL - 业务逻辑层
位置: e:\ProjectBak\AI Coding\Demo2\SnIMS.BLL\
封装业务逻辑,调用 DAL 层接口。
业务类示例(Member.cs):
public class Member
{
private readonly SnIMS.IDAL.IMember dal = FMember.CreateMember();
public readonly SnIMS.IDAL.I_SqlSugar sqlSugar = F_SqlSugar.CreateSqlSugar();
// 缓存操作
public void InitCache(int top = 1000);
public SnIMS.Model.Member GetCache(int id);
public List<SnIMS.Model.Member> GetCache(Func<SnIMS.Model.Member, bool> predicate);
public int AddCache(int id);
public int DeleteCache(int id);
public void UpdateCache(int id);
public void ClearCache();
// CRUD 操作
public int GetMaxId();
public bool Exists(Action<SnIMS.Model.Member> setModel);
public int Add(SnIMS.Model.Member model);
public int Update(SnIMS.Model.Member model);
public int Delete(string Set, string Value);
public SnIMS.Model.Member GetModel(int MemberID);
public DataTable GetTable(...);
public List<SnIMS.Model.Member> GetList(...);
}
特点:
- 支持本机缓存(DbCache)
- 使用工厂模式创建 DAL 实例
- 提供 Lambda 表达式查询支持
6. SnIMS.Engine - 系统数据引擎
位置: e:\ProjectBak\AI Coding\Demo2\SnIMS.Engine\
这是框架的核心引擎,提供数据访问、模板渲染、权限控制等功能。
6.1 Data 类(如 MemberData.cs, MenuData.cs)
每个表对应一个 Data 类,提供高级数据访问功能:
public class MemberData : ControlBasic
{
// 获取数据库结构
public static JsonData GetDataStruct(string[] Cols = null, string ConfigType = null);
// 读取数据实体(含跨表文本)
public static SnIMS.Model.Member GetModel(int id);
// 获取分页数据列表
public static DataTable GetList(SnIMS.Model.Member model, int? top, string key,
string include, string order, int? PageIndex, int? PageSize,
string Selects, string Joins, string SearchKey, bool AutoPage);
// 获取列表(自动填充关联实体)
public static List<SnIMS.Model.Member> GetLists(...);
}
跨表文本自动填充:
// 自动添加 MemberClassID_MemberClass_Name 字段
dt.Columns.Add("MemberClassID_MemberClass_Name", Type.GetType("System.String"));
MemberClassID_MemberClass = TemplateHandle.GetMainTable("MemberClass",
Filter.GetArrFromTable(dt, "MemberClassID"), "MemberClassID,Name", false);
6.2 ControlBasic.cs - 控件基类
支持 .NET 4.8 和 8.0 双框架:
#if NET48
public class ControlBasic : CompositeControl
#else
public class ControlBasic : TagHelper
#endif
{
// 主要配置
public string ControlTag { get; set; } = "v-serv";
public int? DisplayType { set; get; } = 2; // 0=文章,1=单页,2=表格,3=多列表格
// 布局分页
public int CellColumn { get; set; } = 1;
public int? TopNum { set; get; }
// 数据筛选
public bool SysPower { set; get; } = false; // 是否根据权限读取
public bool SysAdmin { set; get; } = false; // 后台/前台
public bool SysPass { set; get; } = false; // 忽略审核条件
// 模板
public string MainTemplate { get; set; }
public string ItemTemplate { get; set; }
public string FootTemplate { get; set; }
}
6.3 TemplateHandle.cs - 模板处理
Razor 动态模板编译:
public static string RenderRazor(string template, object model)
{
RazorLightEngine _engine = new RazorLightEngineBuilder()
.UseMemoryCachingProvider()
.DisableEncoding()
.Build();
string result = _engine.CompileRenderStringAsync(
template.GetHashCode().ToString(), template, model).Result;
return result;
}
模板标签解析:
public static Dictionary<string, string> GetTemplates(string content)
{
var templateNames = new[] { "MainTemplate", "TopTemplate", "ItemTemplate",
"ItemInTemplate", "FootTemplate", "MiddleTemplate",
"CellTopTemplate", "CellFootTemplate" };
// 提取各模板内容
}
翻译功能:
public static string Trans(string input, string code = null)
{
// 根据 LanguageClass 和 Language 表实现多语言翻译
}
6.4 AdminHandle.cs - 后台管理处理
-
GetJoinId(): 简单添加数据 -
CheckThisUser(): 用户验证 -
UpdateFileOrder_Admin(): 文件排序更新
7. SnIMS.Component / SnIMS.Control - 前端组件
位置:
-
e:\ProjectBak\AI Coding\Demo2\SnIMS.Component\(.NET 8.0) -
e:\ProjectBak\AI Coding\Demo2\SnIMS.Control\(.NET 4.8)
每个表对应一个控件类,使用 TagHelper (.NET 8) 或 WebControl (.NET 4.8)。
组件示例(MemberControl.cs):
[HtmlTargetElement("MemberControl")]
[RestrictChildren("MainTemplate", "TopTemplate", "ItemTemplate", "ItemInTemplate",
"FootTemplate", "MiddleTemplate", "CellTopTemplate", "CellFootTemplate")]
public class MemberControl : ControlBasic
{
// 业务属性(自动生成)
[Browsable(true)]
[Category("5-自动生成")]
[Description("名字")]
public string Name { get; set; }
[Browsable(true)]
[Category("5-自动生成")]
[Description("用户组")]
public int? MemberClassID { get; set; }
// 数据源
public List<SnIMS.Model.Member> DataItems { get; set; }
// 渲染逻辑
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
// 构建查询条件
// 渲染模板
// 输出 HTML
}
}
使用示例(Razor 视图):
<MemberControl MemberClassID="1" DisplayType="2">
<MainTemplate>
<table>
<ItemTemplate>
<tr>
<td>{{Name}}</td>
<td>{{MemberClassID_MemberClass_Name}}</td>
</tr>
</ItemTemplate>
</table>
</MainTemplate>
</MemberControl>
8. DAL 层实现
8.1 SqlSugarDAL(ORM 实现)
位置: e:\ProjectBak\AI Coding\Demo2\SnIMS.SqlSugarDAL\
使用 SqlSugar ORM 实现数据访问:
public class Member : IMember
{
public int Add(SnIMS.Model.Member model)
{
var insert = SqlSugarHelper.ModelToInsert(model);
return insert.IgnoreColumns(ignoreNullColumn: true).ExecuteReturnIdentity();
}
public int Update(SnIMS.Model.Member model)
{
var update = SqlSugarHelper.ModelToUpdate(model);
return update.IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand();
}
public DataTable GetList(SnIMS.Model.Member model, int? Top, string Key, string Include,
string Order, int? PageIndex, int? PageSize, string Selects, string Joins)
{
var query = SqlSugarHelper.ModelToQuery(model, "Member");
if (Key.NotEmpty())
{
query = SqlSugarHelper.AddSearchKey(query, Selects, Key);
}
if (Include.NotEmpty())
{
query = query.Where(SqlBuilder.FixCond(Include));
}
// 排序、分页
return query.ToDataTable();
}
}
8.2 SqlserverDAL(原生 ADO.NET 实现)
位置: e:\ProjectBak\AI Coding\Demo2\SnIMS.SqlserverDAL\
使用原生 ADO.NET 和 SqlHelper:
public class Member : IMember
{
public int Add(SnIMS.Model.Member model)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("INSERT INTO [Member] (......) values (......);SELECT SCOPE_IDENTITY();");
return Filter.ToInt(SqlHelper.ExecuteSqlRes(strSql.ToString()));
}
public bool Exists(SnIMS.Model.Member model)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("SELECT COUNT(1) FROM [Member] WHERE 1=1");
// 动态拼接条件
if (model.Name != null)
{
strSql.Append(" AND [Name]='" + Filter.CheckSQL(model.Name) + "'");
}
return SqlHelper.Exists(strSql.ToString());
}
}
8.3 其他 DAL
- MySqlDAL: MySQL 原生实现
- OracleDAL: Oracle 原生实现
- PostgreSqlDAL: PostgreSQL 原生实现
- DmdbDAL: 达梦数据库原生实现
- SQLiteDAL: SQLite 原生实现
- OledbDAL: OleDb 通用实现
- ApiDAL: 通过 API 远程访问数据
- EntityFrameworkDAL: EF ORM(已弃用)
9. SnIMS.Code - 代码生成器
位置: e:\ProjectBak\AI Coding\Demo2\SnIMS.Code\
基于 ASP.NET Web Forms 的代码生成器,可生成:
- Model 实体类(含 ORM 特性)
- IDAL 接口
- Factory 工厂类
- BLL 业务逻辑类
- DAL 数据访问类(支持多种数据库)
- Component/Control 前端组件
生成器特点:
- 读取数据库表结构
- 自动生成完整的 CRUD 代码
- 支持导航属性配置
- 支持跨表文本字段生成
10. SnIMS.Web / SnIMS.Service - 前端项目
SnIMS.Web (.NET 4.8)
- Web Forms 项目
-
使用
.master母版页 -
目录结构:
-
Admin/: 后台管理页面 -
UserCneter/: 用户中心 -
AJAX/: AJAX 接口 -
Api/: API 接口 -
Template/: 模板文件
-
SnIMS.Service (.NET 8.0)
- ASP.NET Core MVC/Razor Pages 项目
- 使用 TagHelper 组件
- 支持 Docker 部署
-
目录结构:
-
Pages/: Razor 页面 -
Components/: 视图组件 -
Api/: API 控制器 -
wwwroot/: 静态资源
-
四、层间调用关系
┌─────────────────────────────────────────────────────────────┐
│ 前端层 (Web/Service) │
│ SnIMS.Web (.NET 4.8) / SnIMS.Service (.NET 8.0) │
│ 使用:MemberControl, MenuControl 等组件 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 组件层 (Component/Control) │
│ 继承 ControlBasic,封装模板渲染和数据绑定 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 引擎层 (Engine) │
│ MemberData, MenuData 等 Data 类 │
│ 提供:GetDataStruct, GetModel, GetList 等方法 │
│ 功能:跨表文本填充、权限控制、模板渲染 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 业务逻辑层 (BLL) │
│ Member, Menu 等业务类 │
│ 提供:缓存管理、业务验证、事务处理 │
│ 调用:dal.Add(), dal.Update(), dal.GetList() 等 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 工厂层 (Factory) │
│ FMember.CreateMember() │
│ 通过反射动态创建 DAL 实例 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 数据访问接口层 (IDAL) │
│ IMember, IMenu 等接口 │
│ 定义标准数据访问方法 │
└─────────────────────────────────────────────────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ SqlSugarDAL │ │ SqlserverDAL │ │ MySqlDAL │
│ (ORM 实现) │ │ (ADO.NET 实现) │ │ (ADO.NET 实现) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
└───────────────┼───────────────┘
▼
┌─────────────────────────────────────────────────────────────┐
│ 数据库 (多数据库支持) │
│ SQL Server / MySQL / Oracle / PostgreSQL / 达梦 / SQLite │
└─────────────────────────────────────────────────────────────┘
五、支持的数据库
| 数据库 | DAL 项目 | 支持程度 |
|---|---|---|
| SQL Server | SnIMS.SqlserverDAL | 完全支持(默认生成) |
| MySQL | SnIMS.MySqlDAL | 完全支持 |
| Oracle | SnIMS.OracleDAL | 完全支持 |
| PostgreSQL | SnIMS.PostgreSqlDAL | 完全支持 |
| 达梦 (DM) | SnIMS.DmdbDAL | 完全支持 |
| SQLite | SnIMS.SQLiteDAL | 完全支持 |
| OleDb | SnIMS.OledbDAL | 通用支持 |
| API 远程 | SnIMS.ApiDAL | 通过 HTTP API |
ORM 支持: SqlSugar(所有上述数据库)
六、前端页面引擎工作原理
1. 组件渲染流程
1. Razor 视图解析 <MemberControl> 标签
↓
2. 触发 MemberControl.ProcessAsync() 方法
↓
3. 读取组件属性(Name, MemberClassID 等)构建查询条件
↓
4. 调用 MemberData.GetList() 获取数据
↓
5. 数据填充跨表文本(如 MemberClassID_MemberClass_Name)
↓
6. 解析模板(MainTemplate, ItemTemplate 等)
↓
7. 使用 RazorLight 编译渲染模板
↓
8. 输出 HTML 到响应流
2. 模板语法
<!-- 静态标签(设计时) -->
<MainTemplate>
<table>
<ItemTemplate>
<tr>
<td>{{Name}}</td>
<td>{{MemberClassID_MemberClass_Name}}</td>
</tr>
</ItemTemplate>
</table>
</MainTemplate>
<!-- 动态 Razor 语法(运行时) -->
<MainTemplate>
@foreach(var item in Model.Data) {
<tr>
<td>@item.Name</td>
<td>@item.MemberClassID_MemberClass_Name</td>
</tr>
}
</MainTemplate>
3. 双框架兼容
#if NET48
public class ControlBasic : CompositeControl // Web Forms
{
protected override void RenderContents(HtmlTextWriter output) { }
}
#else
public class ControlBasic : TagHelper // ASP.NET Core
{
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { }
}
#endif
七、代码生成器功能
生成内容
-
Model 实体类
-
表映射特性
[Table("TableName")] -
列映射特性
[SugarColumn] -
主键特性
[Key] -
导航属性
[Navigate] - 跨表文本字段
-
表映射特性
-
IDAL 接口
- CRUD 方法定义
- 查询方法定义
- 聚合函数方法
-
Factory 工厂类
- 反射创建 DAL 实例
- 缓存管理
-
BLL 业务类
- 缓存操作方法
- 业务逻辑方法
- 调用 DAL 接口
-
DAL 实现类
- SqlSugar ORM 实现
- ADO.NET 原生实现(多数据库)
-
Component/Control 组件
- TagHelper (.NET 8) 或 WebControl (.NET 4.8)
- 属性窗口设计支持
- 模板渲染逻辑
生成器配置
- 读取数据库表结构
- 配置主键、外键关系
- 配置跨表查询字段
- 选择生成的数据库类型
八、内置工具类和业务模块
8.1 工具类汇总
| 类别 | 类名 | 功能 |
|---|---|---|
| 数据转换 | DataCommon, DataTrans | 实体/DataTable/JSON 互转 |
| 数据库 | SqlHelper, SqlSugarHelper | 数据库操作 |
| 字符串 | StringHandle, Filter, Validator | 字符串处理、验证 |
| 加密 | EncryptUtils, AuthCode, MD5 | 加密解密、双因素认证 |
| 文件 | FileControl, Zip, FtpHelper | 文件操作、压缩、FTP |
| HTTP | HttpHandle, WebContext | HTTP 请求、上下文 |
| 缓存 | DataCache, DbCache | 数据缓存 |
| 日志 | Debug | 日志记录 |
| Excel | ExcelOperate | Excel 操作 |
| 邮件 | Smtp | 邮件发送 |
8.2 业务模块
框架预置了以下业务模块(每个模块包含完整的 Model/BLL/DAL/Component):
| 模块 | 说明 |
|---|---|
| Member | 会员管理 |
| MemberClass | 会员分类 |
| Menu | 菜单管理 |
| Power | 权限管理 |
| PowerClass | 权限分类 |
| Company | 公司管理 |
| CompanyDep | 部门管理 |
| Area | 地区管理 |
| Article | 文章管理 |
| ArticleClass | 文章分类 |
| Files | 文件管理 |
| Config | 系统配置 |
| Language | 多语言 |
| Chat | 聊天功能 |
| ChatGroup | 群组 |
| Tasks | 任务管理 |
| WorkStep | 工作流 |
| SMS | 短信 |
| Pay | 支付 |
| News | 新闻 |
| Ad | 广告 |
| Template | 模板管理 |
| OpenApi | 开放 API |
| DataLog | 数据日志 |
| Visited/Visitor | 访问统计 |
| … | 更多模块 |
九、框架设计模式和架构特点
9.1 设计模式
-
工厂模式 (Factory Pattern)
-
SnIMS.Factory动态创建 DAL 实例 - 支持运行时切换数据库实现
-
-
抽象工厂模式 (Abstract Factory)
-
IDAL定义抽象接口 - 多个 DAL 实现(SqlSugar/SqlServer/MySql 等)
-
-
依赖注入 (Dependency Injection)
- BLL 通过工厂注入 DAL
- 支持控制反转
-
模板方法模式 (Template Method)
-
ControlBasic定义渲染流程 - 子类实现具体业务逻辑
-
-
策略模式 (Strategy Pattern)
- 多数据库实现可互换
- 通过配置选择策略
-
单例模式 (Singleton)
- 缓存管理类
- 配置管理类
-
仓储模式 (Repository Pattern)
- DAL 层作为数据仓储
- BLL 层封装业务逻辑
9.2 架构特点
-
分层架构
- 清晰的分层:Model → IDAL → Factory → BLL → Engine → Component → Web
- 各层职责明确,便于维护
-
多数据库支持
- 通过 IDAL 接口实现数据库无关性
- 支持 8 种数据库/数据源
-
双框架兼容
- 同时支持 .NET Framework 4.8 和 .NET 8.0
- 使用条件编译实现兼容
-
代码生成
- 完整的代码生成器
- 减少重复劳动
-
ORM 和 ADO.NET 并存
- SqlSugar ORM 用于通用操作
- ADO.NET 用于高性能/复杂查询
-
前端组件化
- 自定义 TagHelper/WebControl
- 模板化渲染
-
缓存支持
- 本机内存缓存
- 数据库缓存层
-
安全机制
- 多种加密算法
- 双因素认证
- SQL 注入防护
-
可扩展性
- 插件式 DAL 实现
- 可自定义业务模块
-
跨平台
- 支持 Windows 和 Linux
- 支持 Docker 部署
十、总结
SnIMS 是一个功能完善、架构清晰的企业级信息管理系统框架。主要优势包括:
- 完整的分层架构: 从数据访问到前端展示,层次分明
- 多数据库支持: 支持主流数据库和国产数据库
- 双框架兼容: 同时支持 .NET 4.8 和 8.0
- 代码生成器: 快速生成 CRUD 代码
- 前端组件化: 可复用的 UI 组件
- 丰富的工具类: 涵盖常用功能
- 灵活的 ORM: SqlSugar 和 ADO.NET 并存
该框架适合需要快速开发、多数据库支持、跨平台部署的企业级应用项目。
粤ICP备07508382号-8