# Scheduler **Repository Path**: cplmlm/scheduler ## Basic Information - **Project Name**: Scheduler - **Description**: No description available - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-03-30 - **Last Updated**: 2025-09-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 概述 # Scheduler 项目详尽架构与实现分析 ## 1. 项目介绍 Scheduler 是一个基于 .NET 技术栈的调度系统项目,通过清晰的模块划分实现用户权限管理和调度功能,面向企业或团队级的应用需求。该项目利用 Gitee 进行代码托管和团队协作,具备良好的可扩展性与维护性。 - **项目目标**:提供基于角色权限控制的系统调度服务,实现用户认证、权限分配及调度任务管理。 - **目标用户**:企业及团队开发者,尤其关注需要权限细粒度控制及调度功能的业务场景。 - **技术领域**:ASP.NET Core WebAPI、依赖注入、JWT 鉴权、Entity Framework Core (Npgsql)、AutoMapper、日志系统 (NLog)、微服务架构思想等。 ## 2. 技术架构 ### 高层架构概览 系统采用分层架构,主要分为如下核心组件: - **WebAPI 层**:接收 HTTP 请求,处理用户输入,返回接口数据。位于 `Scheduler.WebAPI` 项目。 - **服务层 (Services)**:封装业务逻辑,处理核心功能实现,如用户管理、权限控制。位于 `Scheduler.Services` 项目。 - **仓储层 (Repositories)**:数据访问层,封装数据库操作。位于 `Scheduler.Repositories`。 - **模型层 (Model)**:定义实体类、数据库上下文、DTO 等数据结构。位于 `Scheduler.Model`。 - **公共库 (Common)**:封装工具类、扩展方法、鉴权、日志等辅助功能。位于 `Scheduler.Common`。 - **接口定义层 (IServices)**:定义服务接口,支持依赖倒置和解耦。位于 `Scheduler.IServices`。 ### 组件职责 - `Scheduler.WebAPI`:API 服务配置、请求路由、权限过滤、异常处理中间件、Swagger 文档等。 - `Scheduler.Services`:核心业务逻辑与流程实现,如用户登录认证(`SysUserInfoServices`)。 - `Scheduler.Repositories`:数据库访问接口实现(暂无详细方法实现)。 - `Scheduler.Model`:定义领域实体及数据库上下文,配置 EF Core 与 PostgreSQL 映射。 - `Scheduler.Common`:JWT、权限判断、AutoMapper 映射配置、日志工具、全局变量等。 ### 设计模式与架构原则 - **依赖注入**:利用 Autofac 实现接口与具体实现的解耦,统一管理依赖生命周期。 - **分层架构**:清晰职能划分,遵守单一职责原则。 - **DTO 与映射**:通过 AutoMapper 进行 Entity 与 DTO 的转换,降低耦合。 - **中间件机制**:实现异常拦截(`ExceptionMiddleware`)、授权过滤(`ExceptionFilter`)。 - **JWT 验证**:使用 JWT 鉴权机制保障接口安全。 - **数据库迁移**:支持 EF Core Migrations 自动维护数据库结构。 ### 技术架构关系图 ```mermaid graph TD WebAPI[Scheduler.WebAPI (API 层)] Services[Scheduler.Services (业务层)] Repositories[Scheduler.Repositories (数据访问层)] Model[Scheduler.Model (实体 & EF Core)] Common[Scheduler.Common (工具与扩展)] IServices[Scheduler.IServices (接口层)] DB[(PostgreSQL数据库)] WebAPI --> |依赖| Services Services --> |依赖| IServices Services --> |调用| Repositories Repositories --> |操作| DB Services --> |使用| Model WebAPI --> |使用| Common Services -.-> Common ``` ## 3. 实现细节 ### 应用启动与服务注册(摘自 Program.cs) ```csharp var builder = WebApplication.CreateBuilder(args); // Autofac 容器注册 builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureContainer(builder => { builder.RegisterModule(new AutofacModuleRegister()); }); // 配置 appsettings 并注入服务 builder.Services.AddSingleton(new AppSettings(builder.Configuration)); builder.Services.AddHttpContextSetup(); builder.Services.AddAuthorizationSetup(); builder.Services.AddAuthentication_JWTSetup(); // 配置数据库上下文 - 使用 PostgreSQL builder.Services.AddDbContext(opt => opt.UseNpgsql(builder.Configuration.GetConnectionString("SchedulerContext"))); // 添加控制器及异常过滤器 builder.Services.AddControllers(options => options.Filters.Add()); // Swagger OpenAPI 支持 builder.Services.AddOpenApi(options => options.AddDocumentTransformer()); // AutoMapper 配置 builder.Services.AddAutoMapperSetup(); // HttpClient 支持 builder.Services.AddHttpClient(); var app = builder.Build(); // 省略中间件配置及路由启动代码 ``` ### 控制器示例(UserController.cs) - 负责用户相关接口,实现用户登录功能。 - 依赖业务服务层接口 `ISysUserInfoServices`。 ```csharp [Route("api/[controller]/[action]")] [ApiController] public class UserController : BaseApiController { private readonly ISysUserInfoServices _sysUserInfoServices; public UserController(ISysUserInfoServices sysUserInfoServices) { _sysUserInfoServices = sysUserInfoServices; } [HttpGet] [AllowAnonymous] public async Task> UserLogin(string name = "", string password = "") { return await _sysUserInfoServices.Login(name, password); } } ``` ### 核心服务层示例(SysUserInfoServices.cs) - 实现用户登录逻辑和查询。 - 依赖数据库上下文 `SchedulerContext`,权限需求 `PermissionRequirement`,角色权限服务和映射 `AutoMapper`。 ```csharp public async Task> Login(string name, string password) { // 业务逻辑:校验用户,生成 JWT,构造返回模型 // 省略具体业务代码 } ``` ### 模型层与数据库上下文(SchedulerContext.cs) - 基于 Entity Framework Core,映射多张表:用户、角色、权限、模块、角色权限等。 - 使用 `snake_case` 数据库命名规则。 - 支持 PostgreSQL。 ```csharp public class SchedulerContext : DbContext { public SchedulerContext(DbContextOptions options) : base(options) { } public DbSet Users { get; set; } public DbSet UserRoles { get; set; } public DbSet Permissions { get; set; } public DbSet Modules { get; set; } public DbSet Roles { get; set; } public DbSet RoleModulePermissions { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { foreach (var entity in modelBuilder.Model.GetEntityTypes()) { entity.SetTableName(ConvertToSnakeCase(entity.GetTableName())); foreach (var property in entity.GetProperties()) { property.SetColumnName(ConvertToSnakeCase(property.GetColumnName())); } } } private static string ConvertToSnakeCase(string input) { if (string.IsNullOrEmpty(input)) return input; return Regex.Replace(input, "(?<=[a-z])([A-Z])", "_$1").ToLower(); } } ``` ### 配置管理 - 支持通过 `appsettings.json` 配置数据库连接及其他参数。 - 集成 JWT 认证配置和授权策略,支持 OpenAPI 展示。 - 使用 NLog 作为日志框架。 - 异常中间件与异常过滤器统一管理异常响应。 ```json { "ConnectionStrings": { "SchedulerContext": "Host=...;Database=...;Username=...;Password=..." }, // 省略其他配置片段 } ``` ### 依赖关系架构图 ```mermaid graph TD Autofac[Autofac DI 容器] WebAPI -->|注入| Services Services -->|实现| IServices Services -->|调用| Repositories Repositories -->|EF Core| Model Model -->|PostgreSQL| DB((PostgreSQL)) Common -->|工具| WebAPI Common -->|工具| Services ``` ## 4. 关键功能 ### 用户登录认证 - 使用用户名密码登录。 - 验证用户身份,生成并返回 JWT Token。 - 考虑权限和角色分配进行访问控制。 - 相关文件: - `UserController.cs` 中接口定义 - `SysUserInfoServices.cs` 中实现 - `JwtHelper.cs` 和授权扩展(`AuthorizationSetup.cs`)用于 Token 生成和权限验证。 ### 全局异常处理 - 统一异常处理中间件 `ExceptionMiddleware.cs`。 - 异常过滤器 `ExceptionFilter.cs` 捕获控制器异常并响应标准格式。 - 响应结构统一为 `ApiResponse`。 ### 数据库迁移 - 采用 Entity Framework Core Migrations。 - 支持 PostgreSQL。 - 迁移文件位于 `MigrationsNpgsql` 目录。 ### 权限管理 - 通过 `RoleModulePermission` 实现角色与接口权限映射。 - 权限处理类 `PermissionHandler` 执行具体权限判断。 - 支持声明式权限过滤和基于角色的访问控制。 ## 5. 核心流程与机制 ### 用户登录流程流程图 ```mermaid flowchart TD A[用户请求登录接口] --> B[UserController调用Login] B --> C[SysUserInfoServices执行登录逻辑] C --> D{用户名密码验证} D -->|成功| E[生成JWT Token] D -->|失败| F[返回错误信息] E --> G[返回Token信息至客户端] F --> G ``` ### 异常处理流程 ```mermaid flowchart TD A[API请求] --> B[Controller] B --> C{异常发生?} C -->|是| D[ExceptionMiddleware捕获异常] D --> E[记录日志] E --> F[返回标准Error响应] C -->|否| G[正常响应] ```