# SqlsugarCodeFirstWebApi **Repository Path**: molimoliya/sqlsugar-code-first-web-api ## Basic Information - **Project Name**: SqlsugarCodeFirstWebApi - **Description**: 结构: 01Utils 工具相关 02Repository 数据库仓储相关 03Service 业务层相关 Controllers webapi接口控制器相关 ORM Sqlsugar 日志 Log4Net - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2024-03-29 - **Last Updated**: 2025-12-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SqlsugarCodeFirstWebApi 基于Sqlsugar的CodeFirst模式WebApi项目 ## 说明 这是一个基于Sqlsugar的CodeFirst模式WebApi项目,使用C#和.NET 6.0开发。项目采用多层架构设计,支持商品管理、店铺管理、订单管理、用户权限管理等功能。 ## 技术栈 - .NET 6.0 - Sqlsugar ORM - JWT 身份验证 - Redis 缓存 - SignalR 实时通信 - Elsa 工作流引擎 - Quartz 定时任务 - Swagger API文档 - Log4net 日志 ## 使用说明 1. 安装.NET 6.0 SDK 2. 配置数据库连接 3. 使用Swagger进行API测试 4. 配置Redis和JWT等服务 5. 初始化数据库表结构 ## 特色功能 - 基于Elsa的工作流引擎 - CodeFirst模式数据库迁移 - 全面的权限控制体系 - 实时SignalR通知 - 多租户支持 - 文件上传管理 - 全局异常处理 - 请求日志记录 ## 安装 1. 克隆项目 2. 还原NuGet包 3. 配置appsettings.json 4. 初始化数据库 5. 启动项目 ## 扩展性 - 支持动态插件加载 - 可扩展的仓储模式 - 支持依赖注入 - 模块化设计 - 可扩展的权限系统 ## API文档 项目集成Swagger UI,启动后访问: ``` http://localhost:端口号/swagger ``` # SqlsugarCodeFirstWebApi 介绍 1,使用.net 6 + sqlsugar 开发。运用了仓储模式和ioc依赖注入,日志是log4net。采用了codefirst,可以自动创建数据库,自动更新实体类; 2,内置封装signalr和允许跨域访问接口和signalr; 3,集成swagger文档使用knife4jUI,支持多版本接口维护和分组功能;支持导出接口文档功能; 4,继承elsa2.0的工作流引擎。内置审批流和短信发送的流程节点; 微服务架构: 基于ElsaWorkflow实现业务流程引擎,支持可视化流程编排 实时交互: SignalR实现双向通信,保障监控数据毫秒级推送 分布式缓存: Redis集群实现高速缓存,支持高并发访问 任务调度: Quartz.NET构建分布式任务调度中心 工作流引擎: 使用elsa2.0的审批流程引擎 数据持久层: SqlSugar ORM + MySQL集群,支持千万级数据存储 安全体系: JWT+OAuth2.0双认证机制,支持RBAC权限模型 截图 ![webapi文档界面](CL.WebApi/%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_17124605768044.png) ![工作流表单](CL.WebApi/LimsService/Upload/571b682c2f7f4c4fb0ef1ae6841fd7c.png) ![工作流实例](CL.WebApi/LimsService/Upload/7a20e5b3532c0b0f8ad257a3a295a97.png) 框架支持高并发和高吞吐,下面是关于压力测试的截图: ![压力测试](CL.WebApi/LimsService/Upload/image.png) 安装教程 1,修改appsettings.json文件的数据库连接和数据库类型。 2,还原nuget包之后运行后就可以了。 3,swagger接口文档的账号和密码都是:swagger,取消的话注释相关代码即可。 使用说明 1. 其中test文件夹下的Template类,相关代码是示例代码。 2,WeatherForecastController包含了测试代码。 3,elsa可视化页面地址是:http://XXX/ElsaHost; 参与贡献 1. Admin - 后台权限管理 (zhontai.net) 2. Net6 WebApi: 集成了JWT,SqlSugar,Redis等框架的完整.net 6 webapi项目。内置了很多帮助类,可以直接当作项目使用。 (gitee.com) 3. OpenAuth.Pro-- 最好用的.net权限工作流框架|.net快速开发框架|.net权限管理|.net工作流 4. Vue.NetCore: (已支持SqlSugar).NetCore、.Net6、Vue2、Vue3、Element plus+uniapp前后端分离,全自动生成代码;支持移动端(ios/android/h5/微信小程序。http://www.volcore.xyz/ (gitee.com) 5. wtm框架:低代码+ELSA工作流引擎。https://wtmdoc.walkingtec.cn/ # 项目结构 ## PluginDlls 动态插件扩展项目 ### 说明 动态扩展插件功能的核心代码在PluginCoreHelper文件中。通过反射机制将dll的数据集继承到当前运行的lims系统中,达到动态扩展的效果。 ### 创建动态插件 在PluginDlls文件夹中创建.net 6类库项目,添加项目引用Lims.service。新建一个类继承IPluginDllApi。然后发布类库,把生成的的dll保存下来后续使用。 ### 使用动态插件 首先使用PluginManageController控制器去安装或者卸载扩展插件,然后通过PluginApiController控制器下的GetRequest、PostRequestBody、PostRequestForm接口去进行get、post、post(upload)对应的操作。 具体的使用样例在PersonnelExamApi项目中有演示PersonnelExam的创建、删除、更新、查询、上传文件等功能; #### 安装无依赖nuget包的动态插件 - 这里用人员管理的动态api插件演示。把生成的dll文件打包存放。使用接口去安装插件。 ![输入图片说明](Docs/Images/1image.png) - 使用接口查看安装情况 ![输入图片说明](Docs/Images/2image.png) - 使用人员管理动态插件的方法 ![输入图片说明](Docs/Images/3image.png) #### 安装依赖nuget包的动态插件 - 博客管理的动态api插件,使用了nopi的第三方库。如果直接安装插件,使用的时候会提示错误。需要把nopi的第三方库dll一同安装。这里先按照无依赖的方式安装错误演示下。 ![输入图片说明](Docs/Images/4image.png) - 查看一下安装情况 ![输入图片说明](Docs/Images/5image.png) - 使用插件的时候,发现了错误。是因为没有装nopi对应的依赖 ![输入图片说明](Docs/Images/6image.png) - 我们把博客管理的动态api插件卸载。并重新安装,把对应所依赖的nopi的dll也安装。 ![输入图片说明](Docs/Images/7image.png) ![输入图片说明](Docs/Images/8image.png) ![输入图片说明](Docs/Images/9image.png) - 可以看到已经安装上了,我们再次尝试使用插件。 ![输入图片说明](Docs/Images/10image.png) ![输入图片说明](Docs/Images/11image.png) ## Lims.Util 工具项目 ### 说明 此项目主要存放扩展工具、全局参数、静态常量和各种操作帮助类。 ### 结构 - **Extention** 枚举、字符串、集合的扩展方法 - **Helper** 各种操作帮助类 - **Primitives** 基础类型相关模块 - **Class** 基础类结构 - **Const** 存放常量 - **Enum** 存放枚举 - **Interface** 接口定义,依赖注入使用。有这三个IScopedService、ISingletonService、ITransientService用来管理依赖注入的生命周期 ## Lims.Entity 数据库映射实体项目 ### 说明 此项目主要存放数据库表对应的映射实体,需要保证能和数据库的表结构对应上。否则会出现操作异常问题。 ### 结构 - **Base** 存放sqlsugar映射的一些基类,如:业务删除和删除时间、删除人、创建时间、创建人、修改时间、修改人等实体基类 - **DataBaseEntity** 存放数据库表的映射实体。存放规则:文件夹的名字代表表的前缀,文件夹下的映射实体是表的名称 - **ElsaDataBase** 对应elsa的数据库表实体 ## Lims.Model 扩展实体项目 此项目会存放数据库表映射实体的一些扩展实体。业务操作中常使用的是 xxxInputDto、xxxOutputDto、SearchxxxDto。 ## Lims.Repository 数据库仓储项目 ### 说明 通过sqlsugar的仓储可以访问到数据库表的数据,仓储自动过滤业务删除的数据,可以使用导航和分页功能,内置一些基础的方法。 ### 结构 - **Sqlsugar** - **AppDbContext** 数据库连接类 - **SqlsugarStep** 数据库启动初始化类 - **Utils** - **SqlsugarDbTypeHelper** 记录了一些获取连接和获取数据库类型的方法 - **Repository** 仓储基类 ### 使用 在service业务服务类中,通过构造函数注入的方式引用仓储。然后就可以访问数据库的表,并且可以操作表数据。 ![输入图片说明](Docs/Images/121750836555741.jpg) ## Lims.Service 业务服务项目 ### 说明 核心业务逻辑的承载层。跨repository将数据整合,包含事务的应用都尽量应该这里实现。每一个service都应该聚焦一个业务领域,保持单一职责。通过构造函数注入所需的依赖。存放大量的crud(增删改查)操作 ### 结构 - **DI** - **InitDI** 初始化注入,系统启动后自动注入 - **ElsaWorkFlow** - **ElsaDefinitionStep** 工作流的活动节点,如审批,短信通知等。 - **InitElsaWorkFlow** 初始化工作流的服务,将自定义节点同步系统页面。 - **PluginManagers** 动态扩展插件的基础服务 - **Redis** 操作Redis的基础服务 - **Service** lims系统业务的基础服务 - **SignalR** 即时通知的服务,已经封装为全局静态类,系统内任意调用 ## Lims.WebApi 接口控制器项目 ### 说明 Service层和Controller层通过分层实现代码的解耦和复用。Webapi中的顶层入口,直接处理http请求和响应。委托调用单个或多个service的方法实现业务。集合权限校验实现接口级别的权限控制。Controller层应该避免直接包含业务,每个请求都是独立的,不保存业务的状态。统一响应格式。 ### 结构 #### Areas 将后台管理的接口分区处理,大概分为lims侧区域、客户侧区域、混合区域(属于lims侧和客户侧均有)、其他区域(类如测试或开放api接口)。 #### Authorization Middleware 中间件,记录请求接口的路径、参数、时长等信息。WebApiFilter 存放拦截器,通过校验请求的token,校验能否访问接口。 #### Controllers 存放了一些基控制器,用来做接口的权限控制,搭配Authorization文件夹下的一些Attributes特性。可以实现lims侧的接口客户侧账号无法使用,反之一样。但是通过这些特性可以针对一些特别接口让lims侧和客户侧一起用。 #### Plugins 存放的动态扩展的dll文件,系统启动会去读取这些dll文件到程序集中。 #### Appsettings - **SystemConfigs** 系统开关配置,包含:开关swagger文档、开关elsa操作界面、开关安全模式(这里的安全模式是指token校验和客户侧校验。调试关闭,发布的时候开启这个) - **ConnectionStrings** 数据库连接字符串 - **LimsQuartz** quartz的配置,其中instanceNmae字段需要特别注意。多个Limsapi程序连接使用同一个数据库,需要更改实例名称。否则会互相干扰。确保每个程序都有唯一的实例名。目前持久化做了mysql,其他数据库的创建命令去quartz的开源项目中找对应的SQL脚本。 - **JWT** 当用户登录后,每个后续请求都将包含JWT,允许用户访问服务和资源。 - **DefaultData** 默认种子数据。如:usercode就是管理员账号。rolename就是默认超级管理员的角色身份。CustomerRoleName就是客户侧的身份,只要角色对应CustomerRoleName里面的值,代表就有客户侧的权限。 - **FileConfig** 文件配置。 - **BaseApiSecurityToken** 核心业务访问token令牌,要求前端传入携带token的header的值要一致才能访问。 - **OpenApiSecurityToken** 开放业务访问token令牌,要求请求接口携带token的header的值要一致才能访问。 - **AllowedHosts** 跨域配置 - **WindowsServicewindows** 服务监听配置 - **RedisService** redis连接配置 ## Lims.Quartz 服务器定时器项目 ### 说明 Quartz是开源作业调度框架,可以根据时间间隔调度作业。可以理解为一个服务器端的定时器 ### 结构 - **Factorys** 存放quartz的自定义工厂 - **Jobs** 存放quartz的job任务 - **Listeners** 存放quartz的监听器 - **LimsQuartzInit** 初始化quartz类 ### 创建和使用 在jobs的文件夹下创建一个testJob类并且继承IJob,然后实现execute方法。把需要定时执行的操作写在这里。 在LimsQuartzInit中写方法用触发器去控制testJob。LimsQuartzInit中自己会注册当前程序集的jiob无需手动注册,并且会随着系统启动去启动job。数据库持久化也在LimsQuartzInit中。 ## 许可证 本项目采用MIT开源许可证,请查看LICENSE文件获取详细信息。