# InformationManagement **Repository Path**: xinjunhua/informationmanagement ## Basic Information - **Project Name**: InformationManagement - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-11 - **Last Updated**: 2026-01-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 信息管理系统 (Information Management System) ## 技术栈 - **后端**: ASP.NET Core Web API (.NET 9) - **前端**: Blazor WebAssembly - **UI框架**: Ant Design Blazor - **认证**: JWT Authentication - **数据库**: Entity Framework Core with SQL Server ## 项目结构 ``` src/ ├── InformationManagement/ # 主项目 (Web API) ├── InformationManagement.Client/ # Blazor WebAssembly 客户端 ├── InformationManagement.Domain/ # 领域层 ├── InformationManagement.Infrastructure/ # 基础设施层 ├── InformationManagement.Migrations/ # 数据库迁移 ├── InformationManagement.Model/ # 数据模型和DTO ├── InformationManagement.Service/ # 业务服务层 └── InformationManagement.Shared/ # 共享代码 ``` ## 启动项目 ### 开发环境要求 - .NET 9 SDK - SQL Server - Visual Studio 2022 或 Rider ### 启动步骤 1. **克隆项目** ```bash git clone cd InformationManagement ``` 2. **配置数据库连接** - 打开 `src/InformationManagement/appsettings.Development.json` - 修改 `ConnectionStrings` 中的 `DefaultConnection` 为你的 SQL Server 连接字符串 3. **执行数据库迁移** ```bash dotnet ef database update --project src/InformationManagement.Migrations --startup-project src/InformationManagement ``` 4. **启动项目** ```bash dotnet run --project src/InformationManagement ``` 5. **访问应用** - 应用将在 `http://localhost:5082` 启动 - 客户端应用将在同一地址自动加载 ## 关于服务调用的说明 在本项目中,**不直接在页面中使用 HttpClient** 进行API调用。所有的API请求都通过注入服务的方式实现,这有助于: 1. **关注点分离**:页面只负责UI展示和用户交互,不直接处理API请求逻辑 2. **代码复用**:服务层可以在多个页面中共享 3. **可测试性**:服务层可以独立进行单元测试 4. **统一错误处理**:所有API请求的错误处理可以集中在服务层 ### 服务注入和使用方法 #### 1. 定义服务接口 在 `InformationManagement.Services/Services` 目录下定义服务接口: ```csharp public interface IUserService { Task> GetAllUsersAsync(); Task CreateUserAsync(CreateUserDto userDto); // 其他方法... } ``` #### 2. 实现服务 在 `InformationManagement.Services/Services` 目录下实现服务接口,提供获取数据方法: ```csharp private readonly IUserRepository _userRepository; private readonly UserManager _userManager; private readonly RoleManager _roleManager; private readonly IMediator _mediator; ///构造方法依赖注入 public UserService(IUserRepository userRepository, UserManager userManager, RoleManager roleManager, IMediator mediator) { _userRepository = userRepository; _userManager = userManager; _roleManager = roleManager; _mediator = mediator; } public async Task GetUserByIdAsync(int id) { var user = await _userRepository.GetByIdAsync(id); if (user == null) { throw new Exception("用户不存在"); } return MapToUserDto(user); } ``` #### 3. 注册服务 可忽略 **注册服务已经由`AutofacModule`自动注入了,可以直接查看类,因此不需要再手动注入了** 在 `InformationManagement.Client/Program.cs` 中注册服务: ```csharp public static void AddClientServices(IServiceCollection services) { services.AddAntDesign(); // 注册客户端服务 services.AddScoped(); services.AddScoped(); } ``` #### 4. 在页面中使用服务 在Blazor页面中注入并使用服务: 页面在`InformationManagement.Clent/Pages`中 ```razor @page "/users" @using AntDesign @using InformationManagement.Model.DTOs @using InformationManagement.Client.Services @inject IUserService UserService @code { private List UserList { get; set; } = []; private bool Loading { get; set; } = false; protected override async Task OnInitializedAsync() { await LoadUsers(); } private async Task LoadUsers() { Loading = true; try { UserList = (await UserService.GetAllUsersAsync()).ToList(); } catch (Exception ex) { await Message.ErrorAsync($"加载用户失败:{ex.Message}"); } finally { Loading = false; } } // 其他方法... } ``` ## 整体逻辑 1. 依赖优先级:`Domain`层(核心,无外部依赖)→ `Shared`层(公共资源,无外部依赖)→ `Infrastructure`/`Model`层 → `Service`层 → 主项目 /`Client`端 /`Migrations`项目 2. 请求流转逻辑:前端`Client`端 → 主项目(API 控制器)→ `Service`层(业务编排)→ 「`Domain`层(业务规则)+ `Infrastructure`层(数据 / 外部资源)」→ 反向返回结果 3. 数据流转逻辑:`DTO`(`Model`层)←→ 领域实体(`Domain`层)←→ 数据库(`Infrastructure`层 +`Migrations`项目),跨项目共用资源(`Shared`层) # 常见误区: 1. 误区 1:DDD 只适用于大项目 —— 错!小项目可 “简化版 DDD”(比如保留 “领域实体 + 仓储抽象”,省略复杂的领域事件、聚合根规则),核心是 “业务逻辑集中管理”; 2. 误区 2:DDD 必须用特定框架 —— 错!DDD 是 “设计思想”,不是工具,任何语言(C#/Java)、任何框架(EF Core/MyBatis)都能落地; 3. 误区 3:DDD = 复杂设计 —— 错!DDD 的核心是 “简化业务理解”,如果设计变复杂,大概率是 “过度设计”(比如没必要的聚合根拆分、领域事件滥用) ## 详细文档 ## 主要功能 - **用户管理**:用户的创建、编辑、删除和状态管理 - **角色管理**:角色的创建、编辑、删除和权限分配 - **认证与授权**:基于JWT的身份认证和基于角色的授权 ## 开发规范 1. **代码风格**:遵循Microsoft C#编码规范 2. **命名约定**: - 类名:PascalCase - 方法名:PascalCase - 变量名:camelCase - 接口名:以I开头,PascalCase 3. **错误处理**:所有API调用都应包含适当的错误处理 4. **日志记录**:使用Microsoft.Extensions.Logging记录关键操作和错误 ## 许可证 MIT License