# 通用管理项目-admin **Repository Path**: judy6/general-management-project-admin ## Basic Information - **Project Name**: 通用管理项目-admin - **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-07-01 - **Last Updated**: 2025-07-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 一个通用管理项目 ## 前端文件——frontend ### 1.创建一个vue项目 1. 使用pnpm创建项目(更便捷) ```bash # 使用npm全局安装pnpm npm install -g pnpm # 创建项目 pnpm create vue # 进入项目根目录 cd Blog2025Frontend # 安装项目所有依赖项 pnpm install # 执行项目配置的代码格式化脚本 pnpm format # 启动项目 pnpm dev ``` ## 后端文件——backend ### 1. 创建sln解决方案 ```bash # 在后端文件中创建 dotnet new sln -n Blog2025 ``` ### 2. 使用分层架构创建项目(领域驱动设计DDD或清洁架构) 1. 在后端文件中创建src文件夹 2. 在src中创建文件 ```bash # 创建webapi项目——API入口层 dotnet new webapi -o Blog2025.Api # 创建领域层类库 ## 领域模型层 dotnet new classlib -o Blog2025.Domain ## 应用服务层 dotnet new classlib -o Blog2025.Application ## 基础设施层 dotnet new classlib -o Blog2025.Infrastructure ``` 3. 使用**分层架构**设计项目文件 - Blog2025.Api - 系统入口层,处理HTTP请求与响应 - ✅ RESTful API控制器 - ✅ 身份认证中间件 - ✅ 请求模型验证 - ✅ Swagger/OpenAPI文档生成 - ✅ 全局异常处理 - Blog2025.Application - 应用服务层,协调领域层实现具体业务用例 - ✅ 用例实现(CQRS模式中的Command/Query) - ✅ DTO(数据传输对象)定义 - ✅ 工作单元控制 - ✅ 领域事件订阅处理 - Blog2025.Domain - 领域模型层,包含领域实体、值对象、领域服务、领域事件等纯业务逻辑 - ✅ 领域实体(如用户、角色、权限) - ✅ 领域规则验证逻辑 - ✅ 聚合根定义 - ✅ 仓储接口声明(不包含具体实现) - Blog2025.Infrastructure - 基础设施实现层,提供技术能力支撑 - ✅ 仓储实现(数据库访问) - ✅ 消息队列/缓存等外部服务集成 - ✅ 文件存储/邮件发送等技术组件 - ✅ 安全加密实现(如JWT处理) 4. 将生成项目添加到解决方案中 ```bash # 回到后端文件 cd cd ..\ # dotnet sln add 要添加进解决方案的项目文件 dotnet sln add .\src\Blog2025.Api dotnet sln add .\src\Blog2025.Application dotnet sln add .\src\Blog2025.Domain dotnet sln add .\src\Blog2025.Infrastructure ``` ### 3. 在领域层添加仓储接口 1. 在领域层创建接口文件(Repositories\IRepository.cs) 2. 在基础设施层实现接口的EF仓储类 - 创建仓储文件(Repositories\EfRepository.cs) - 实现接口时,要引入领域层的接口文件(终端命令在backend中执行) ```bash #被引入的文件 reference 要引入的文件 dotnet add .\src\Blog2025.Infrastructure\ reference .\src\Blog2025.Domain\ ``` ### 4. 在基础设施层配置数据库上下文并在接口文件中注入依赖 1. 在基础设施层创建Data/Blog2025DbContext.cs文件 2. 填写数据库上下文代码 3. 安装Postgresql数据库的依赖包(在backend目录下安装依赖包到基础设施层) ```bash #安装Postgresql依赖包,要指定版本号防止版本冲突 dotnet add .\src\Blog2025.Infrastructure\ package Npgsql.EntityFrameworkCore.Postgresql -v 8 ``` 4. 将安装好的依赖包引入接口文件,并完成依赖注入 ```cs using Microsoft.EntityFrameworkCore; ``` ### 5. 在基础设施层创建服务集合扩展 1. 创建ServicesCollectionExtenstion.cs文件(服务集合扩展文件) - 对接口进行功能扩展 - 实现依赖注入(DI)服务的集中注册 2. 注册DbContext,使用PostgreSQL 3. 注册仓储实现 4. 在API项目的`progrm.cs`中调用 - 在API入口层引入基础层 ```bsh dotnet add .\src\Blog2025.Api\ reference .\src\Blog2025.Infrastructure\ ``` - 在progrm.cs中注册 ```cs builder.Services.AddInfrastructure(builder.Configuration); ``` ### 6. API入口层利用RBAC模式完善相应的领域实体、领域服务(包含分配角色、移除角色) - 在`AppUser.cs`中 ```cs public ICollection Roles { get; set; } = new List(); public void AssignRole(AppRole role) { if (!Roles.Contains(role)) Roles.Add(role); } public void RemoveRole(AppRole role) { if (Roles.Contains(role)) Roles.Remove(role); } ``` - 在`AppRole.cs`中 ```cs public ICollection Permissions { get; set; } = new List(); public ICollection Users { get; set; } = new List(); ``` - `在AppPermission.cs`中 ```cs public ICollection Roles { get; set; } = new List(); ``` ### 7. 利用RBAC尝试用户的注册登录业务 **RBAC**:通过角色分配实现权限管理的访问控制机制。其核心要素包含角色定义、权限集和访问范围,通过将用户或组与特定角色绑定来控制对系统资源的操作权限 1. 应用层创建服务Service\AuthService.cs 2. 注入代码并引入文件 ```bash dotnet add .\src\Blog2025.Application\ reference .\src\Blog2025.Domain\5.Application\ reference .\src\Blog2025.Domain\ ``` 3. API入口层控制器调试 - 在Program.cs中转换成控制器模式 - 在API入口层创建控制器文件 - 将引用层服务引入到API入口层 ```bash dotnet add .\src\Blog2025.Api\ reference .\src\Blog2025.Application\ ``` - 在应用层创建`ServicesCollectionExtenstion.cs`服务集合扩展文件 - 创建后在应用层安装`IServiceCollection`的类库 ```bash # 指定版本号,有时不需要 dotnet add .\src\Blog2025.Application\ package Microsoft.Extensions.DependencyInjection.Abstractions ``` - 在Program.cs中注册服务集合扩展文件 ```cs builder.Services.AddApplication(); ``` - 在控制器中编写登录业务、注册业务代码并注入依赖 - 创建一个Dto数据传输对象并在控制器中引用 ### 8. 数据库迁移同步 - 数据库迁移 ```bash dotnet add .\src\Blog2025.Api\ package Microsoft.EntityFrameworkCore.Design -v 8 dotnet tool install --global dotnet-ef dotnet ef migrations add First -p .\src\Blog2025.Infrastructure\ -s .\src\Blog2025.Api\ ``` - 数据库更新 ```bash dotnet ef database update -p .\src\Blog2025.Infrastructure\ -s .\src\Blog2025.Api\ ``` ### 9. 将Postgresql部署到服务器上,并且可以远程连接 https://gitee.com/judy6/deploy-on-cloud-servers-postgresql-remote-linkage ### 10. 运行 > 进入API入口层,运行:dotnet watch ### 11. 将领域层的基础类里的关系设置为多对多完成领域模型和服务实现 - 用户-角色 - 角色-权限 ### 12. 进一步扩展数据权限、审计功能 - 数据权限扩展 - 通常与组织、部门、数据范围有关 - 可为用户、角色增加“数据范围”字段,或建立与组织/部门的关联 - 审计扩展 - 审计字段(已存在):CreateAt、CreateBy、UpdateAt、UpdateBy - 增添操作日志表,记录关键操作 ### 13. 用户管理、角色管理、部门管理、权限管理的api接口 - **用户管理** 1. 在应用层创建`Services/IUserAppServices.cs`接口文件 2. 在文件内编写用户管理功能的接口 > 创建用户 删除用户 禁用用户 启用用户 修改用户信息 分配角色 移除角色 头像更新 昵称更新 密码更新 3. 在应用层创建`Services/UserAppServices.cs`文件实现接口 4. 在应用层创建数据传输对象文件`Dto\UserDto.cs、Dto\CreateUserDto.cs等` 5. 在领域层基础类用户表中添加一些字段(昵称等) 6. 在应用层创建`Common\ApiResult.cs`文件,将返回结果统一封装 7. 在API入口层创建用户控制器`UserController.cs` - **角色管理** > 创建角色 删除角色 修改角色 获取角色 角色详情 角色权限 - **部门管理** > 创建部门 删除部门 修改部门 获取部门 部门详情 - **权限管理** > 新增权限 删除权限 修改权限 获取权限 权限详情 ### 完成分页功能 ### 通用过滤器 1. 创建过滤器 ``` ├── Domain/ │ ├── Entities/ │ │ ├── Product.cs │ ├── Filters/ │ │ ├── IFilter.cs 创建过滤器接口 ├── Infrastructure/ │ ├── Filters/ │ │ ├── GenericFilter.cs 实现接口 │ │── ServicesCollectionExtenstion.cs 注册接口 ``` 2. 在应用层使用过滤器 - 在IUserAppService.cs中创建 ```c# Task GetFilterAsync(Dictionary filters); ``` - 在UserAppService.cs中实现 ```c# public async Task GetFilterAsync(Dictionary filters) { var users=await _userRepo.GetAllAsync(); return _filter.Filter(users,filters); } ``` 3. 在控制器调用过滤器,传入过滤条件 ```c# [HttpGet("filter")] public async Task GetFilter() { var filters=new Dictionary { {"username","丽丽"} }; var res=await _service.GetFilterAsync(filters); return Ok(res); } ``` ```c# // 单个字段的过滤条件 { "Name", "John" } // 等于 "John" { "Age", 30 } // 等于 30 { "IsActive", true } // 等于 true // 复合条件(针对同一个字段的多个操作) { "Age", new Dictionary { { "gt", 25 }, // 大于 25 { "lt", 40 } // 小于 40 } } ``` ### JWT安全密钥 1. 创建JWT接口 ``` ├── Application.Contracts/ │ ├── Configurations/ │ │ ├── JwtSettings.cs 创建JWT实现类 │ ├── Interface/ │ │ ├── IJwtService.cs 创建JWT接口 ├── Infrastructure/ │ ├── Jwt/ │ │ ├── JwtService.cs 实现接口 │ │── ServicesCollectionExtenstion.cs 注册接口 ├── Api/ │ ├── Dto/ │ │ ├── UserLogingDto.cs Jwt登录时数据传输对象 ├── Application/ │ ├── Services/ │ │ ├── AuthServices.cs 注入接口依赖,用户登录时使用Jwt接口判断 │ │── ServicesCollectionExtenstion.cs 注入Jwt配置 ``` 2. 在基础设施层安装Jwt的依赖包 ```bash dotnet add .\src\Blog2025.Infrastructure\ package System.IdentityModel.Tokens.Jwt dotnet add .\src\Blog2025.Infrastructure\ package Microsoft.AspNetCore.Authentication.JwtBearer -v 8 ``` 3. JWT接口配置(在配置文件中) ```json "Jwt":{ "Issuer":"闽大", "Audience":"国人", "SecretKey":"中华人民共和国万岁世界人民大团结万岁2025年度管理系统密钥!@#", "ExpireMinutes":"120", "ClockSkewSeconds":"60", "RefreshTokenExpireMinutes":"1440" } ``` 4. 在应用层AuthService中注入Jwt接口依赖 5. 在应用层安装依赖 ```bash # 安装注入配置所需的依赖 dotnet add .\src\Blog2025.Application\ package Microsoft.Extensions.Options.ConfigurationExtensions -v 9.0.0 dotnet add .\src\Blog2025.Application\ package Microsoft.Extensions.Configuration dotnet add .\src\Blog2025.Application\ package Microsoft.Extensions.DependencyInjection.Abstractions ``` 6. 在Api入口层控制器中完成Jwt登录功能 ### 文件上传功能 ``` ├── Application/ │ ├── Configurations/ │ │ ├── FileUploadSettings.cs 创建上传配置类 │ ├── Dto/ │ │ ├── FileUploadDto.cs 创建上传相关的Dto数据传输对象 │ ├── Services/ │ │ ├── IFileUploadService.cs 创建上传服务接口 │ │ ├── FileUploadService.cs 创建上传服务实现 │ │── ServicesCollectionExtenstion.cs 更新依赖注入配置 │ │── Common │ │ ├── FileUploadService.cs ├── Api/ │ ├── Controllers/ │ │ ├── ApiResult.cs 为ApiResult添加泛型 │ ├── wwwroot/uploads/ 创建上传文件的存储文件 ``` 1. **创建上传配置类**:FileUploadSettings.cs 2. **创建上传相关的Dto数据传输对象**:FileUploadDto.cs 3. **创建上传服务接口**:IFileUploadService.cs 4. **创建上传服务实现**:FileUploadService.cs 5. **创建文件上传控制器**:FileUploadController.cs 6. **更新依赖注入配置**:ServicesCollectionExtenstion.cs 7. **更新配置文件**:sppsettings.json 8. **更新Program.cs以支持静态文件**:sppsettings.json 9. **安装必要的依赖包**: ```bash dotnet add .\src\Blog2025.Application\ package Microsoft.AspNetCore.Http.Features -v 5.0.17 dotnet add .\src\Blog2025.Application\ package Microsoft.Extensions.Logging.Abstractions -v 8.0.0 dotnet add .\src\Blog2025.Application\ package System.Drawing.Common -v 8.0.0 ``` 10. **文件上传测试**: ```http ### 上传单个文件 POST {{url}}/api/FileUpload/upload HTTP/1.1 ### 声明请求体使用multipart/form-data编码,并自定义分界符为boundary123。分界符用于分隔请求体中的不同部分‌ Content-Type: multipart/form-data; boundary=boundary123 ### 携带Bearer Token进行身份验证‌ Authorization: Bearer {{authToken}} --boundary123 ### 定义表单字段名(name="file")和文件名(filename="test-image.jpg")‌ Content-Disposition: form-data; name="file"; filename="test-image.jpg" ### 指定当前部分的数据类型为JPEG图像‌ Content-Type: image/jpeg ### 表示从本地路径./test-files/test-image.jpg读取文件二进制数据‌ < ./test-files/test-image.jpg --boundary123-- ``` ### 领域事件 清洁架构依赖规则示例: - 领域层 → 定义事件 - 应用层 → 发布事件(依赖接口) - 基础设施层 → 实现事件总线(实现接口) #### 基于MediatR的领域事件 **文件结构** ``` ├── Application/ │ ├── Extensions/ │ │ ├── DomainEventExtensions.cs 提供便捷的事件发布方法 │ ├── Events/ │ │ ├── DomainEventNotification.cs 领域事件到 MediatR 通知的适配器 │ ├── EventHandlers/ │ │ ├── UserCreatedAuditHandler.cs 用户创建事件处理器 - 记录审计日志 │ │ ├── UserCreatedWelcomeHandler.cs 用户创建事件处理器 - 发送欢迎邮件 │ │ ├── UserDeletedAuditHandler.cs 用户删除事件处理器 - 记录审计日志 │ │ ├── UserDeletedCleanupHandler.cs 用户删除事件处理器 - 清 理相关数据 │ ├── Services/ 注册 MediatR │ │ ├── AppUserService.cs 调用静态工厂方法(自动发布事件) │ ├── ServicesCollectionExtenstion/ 注册 MediatR ├── Domain/ │ ├── Entities/ │ │ ├── EntityBase.cs 提供领域事件收集和管理功能 │ │ │ ├── App │ │ │ │ ├── AppUser.cs 在创建时发布领域事件 │ ├── Events/ │ │ ├── IDomainEvent.cs 创建领域事件接口 │ │ ├── UserCreatedEvent.cs 用户创建事件的具体实现 │ │ ├── UserDeletedEvent.cs 用户删除事件的具体实现 ``` 1. 架构设计: > 请求 → 控制器 → 应用服务 → 实体(发布事件) → 保存数据库 → MediatR分发事件 → 事件处理器 2. 核心组件 - 领域事件接口 - `IDomainEvent`: 基于 MediatR 的 INotification 接口 - `UserCreatedEvent`: 用户创建事件的具体实现 - 实体基类 - `EntityBase`: 提供领域事件收集和管理功能 - `AppUser`: 用户实体,在创建时发布领域事件 - 事件处理器 - `UserCreatedAuditHandler`: 记录用户创建的审计日志 - `UserCreatedWelcomeHandler`: 发送欢迎邮件 - 扩展方法 - `DomainEventExtensions`: 提供便捷的事件发布方法 3. 依赖包 ```bash dotnet add .\src\Blog2025.Application\ package MediatR dotnet add .\src\Blog2025.Domain\ package MediatR.Contracts ``` # 类型图 ## 利用DDD思想,设计基于RBAC的充血模型的类型图 -‌ `User(用户)‌`:代表系统的使用者,具有一系列属性,如用户名、密码、邮箱等,以及与用户相关的业务方法,如登录、注销等。在充血模型中,User对象不仅包含用户数据,还能执行与用户相关的业务操作。 -‌ `Role(角色)‌`:代表一组权限的集合,具有角色名、描述等属性,以及添加权限、移除权限等业务方法。Role对象能够管理与其关联的权限集合。 -‌ `Permission(权限)‌`:代表对特定资源的操作权限,具有资源标识、操作类型等属性。在充血模型中,Permission对象可能包含判断用户是否具有执行特定操作权限的方法。 -‌ `UserRoleAssignment(用户角色分配)‌`:表示用户与角色之间的多对多关系。这个类型可能包含用户ID、角色ID等属性,以及分配角色、撤销角色等业务方法。它负责维护用户与角色之间的关联关系。 -‌ `RolePermissionAssignment(角色权限分配)‌`:表示角色与权限之间的多对多关系。这个类型可能包含角色ID、权限ID等属性,以及分配权限、撤销权限等业务方法。它负责维护角色与权限之间的关联关系。