# ProjectManage **Repository Path**: dingshuanglei/ProjectManage ## Basic Information - **Project Name**: ProjectManage - **Description**: No description available - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-24 - **Last Updated**: 2026-07-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目协同管理平台 (ManageProject) 基于 **ASP.NET Core 10.0** 的项目协同管理平台,采用 **Blazor Server** 实现服务端渲染交互,结合领域驱动设计(DDD)风格的分层架构。支持本地账号登录与 SSO 单点登录,提供项目层级管理、用户-项目绑定、权限控制与多语言等能力。 > 说明:本项目为单体应用,Domain / Application / Infrastructure / Client 四层以命名空间约定组织在同一个程序集 `ManageProject` 中(并非物理边界)。 ## 技术栈 - **框架**: ASP.NET Core 10.0(Blazor Server / Interactive Server Components) - **前端组件库**: Ant Design Blazor - **数据库**: PostgreSQL(EF Core + Npgsql) - **认证**: 自定义 Cookie 认证(方案 `CustomAuth`)+ SSO 回调(**非 JWT**) - **状态管理**: Fluxor(按特性分 State:Auth / Project / SystemSettings / Dashboard) - **本地化**: 数据库驱动(`LocalizationResource`),运行时 zh-CN / en-US 动态切换 - **日志**: Serilog - **其他中间件**: 健康检查、防重放(Antiforgery)、限流(RateLimiter)、输出缓存(OutputCache)、权限中间件 - **映射**: AutoMapper;**校验**: FluentValidation ## 架构设计 项目采用分层架构,依赖方向自外向内(Client/Infrastructure → Application → Domain),Domain 层不依赖任何基础设施: ``` src/ManageProject/ # 主项目(单体,四层同程序集) ├── Domain/ # 领域层(纯净,无基础设施依赖) │ ├── Entities/ # 实体与聚合根:User, Project, Department, Role, │ │ # Permission, ProjectMember, ProjectSettings... │ ├── Interfaces/ # IRepository, IUnitOfWork │ ├── Extensions/ # 表达式组合扩展(AddAnd / AddOr) │ └── Enums/ ├── Application/ # 应用层 │ ├── Services/ # CrudServiceBase 及 ProjectService, AuthService, │ │ # LocalizationService, Permission*Service... │ ├── DTOs/ # 输入输出 DTO 与校验 │ ├── Interfaces/ # 服务接口(Application / Auth / Projects) │ └── DependencyInjection.cs # 应用层服务注册 ├── Infrastructure/ # 基础设施层 │ ├── Data/ # AppDbContext, UnitOfWork(事务边界) │ ├── Repositories/ # 仓储实现(共享 UnitOfWork 的同一 DbContext) │ ├── Authentication/ # CustomAuthStateProvider, Cookie 认证 │ ├── Caching/ # 内存缓存(带前缀失效) │ ├── Security/ # 密码哈希 │ └── DependencyInjection.cs # 基础设施注册(EF Core / 认证 / 仓储 / 缓存) ├── Client/ # 前端状态(Fluxor) │ └── State/ # 按特性:Auth, Project, SystemSettings, Dashboard... ├── Components/ Pages/ # Blazor Server 组件与 Razor 页面 ├── Program.cs # 启动入口(中间件编排) ├── appsettings.json # 应用配置(含 PostgreSQL 连接字符串) └── ManageProject.csproj ``` ### 关键设计 - **统一上下文与事务边界**:所有仓储共享 `UnitOfWork` 持有的同一个 `AppDbContext` 实例;`IUnitOfWork` 提供 `BeginTransactionAsync / CommitAsync / RollbackAsync / SaveChangesAsync`,组合写操作(如创建项目 + 创建者为成员 + 写入流程记录)可在同一事务内原子提交。 - **充血领域模型**:`User` / `Project` / `Role` 等携带行为(如 `User.RecordFailedLogin`、`Project.ChangeStatus`),而非贫血实体。 - **统一返回与异常处理**:`ApiResultFilter` / `ApiExceptionFilter` 提供一致的 API 响应封装。 ## 功能特性 - [x] 用户登录(本地账号 / SSO 回调) - [x] 密码管理(忘记密码、锁定策略) - [x] 用户认证与授权(基于权限中间件 + 路由权限配置) - [x] 项目层级管理与状态流转 - [x] 用户-项目绑定关系与负责人分配 - [x] 操作日志 / 业务日志记录 - [x] 多语言(数据库驱动,运行时切换) - [x] 内存缓存服务(带前缀失效) ## 快速开始 ### 环境要求 - .NET 10.0 SDK - PostgreSQL 数据库实例 - Visual Studio 2022 / Rider / VS Code ### 配置数据库连接 在 `src/ManageProject/appsettings.json` 中配置 PostgreSQL 连接字符串(`DefaultConnection`): ```json { "ConnectionStrings": { "DefaultConnection": "Host=localhost;Port=5432;Database=manageproject;Username=postgres;Password=yourpassword" } } ``` ### 运行项目 ```bash # 克隆项目 git clone cd ProjetManage # 还原并运行(首次启动会自动初始化数据库与种子数据) dotnet run --project src/ManageProject/ManageProject.csproj ``` 运行后请访问控制台输出的本地地址(具体端口见 `src/ManageProject/Properties/launchSettings.json`)。 ### 初始账号 系统启动时会自动初始化测试数据: - 用户名: `admin` - 密码: `123456` ## 测试 测试项目位于 `tests/`,包含 3 个项目: - `ManageProject.Application.Tests` - `ManageProject.Domain.Tests` - `ManageProject.Infrastructure.Tests` ```bash # 运行全部测试 dotnet test ProjectManage.slnx ``` ## 开发规范 ### 命名与代码风格 代码风格由仓库根目录 `.editorconfig` 统一约束(UTF-8、LF 换行、4 空格缩进、`_camelCase` 私有字段),并可通过 `dotnet format` 自动格式化。 - **类名**: PascalCase(如 `ProjectService`) - **方法名**: PascalCase(如 `CreateAsync`) - **变量名**: camelCase(如 `userName`) - **私有字段**: `_camelCase`(如 `_unitOfWork`) ### 分层约束 - Domain 层禁止引用 Infrastructure / Application。 - 仓储通过 `IUnitOfWork` 共享同一 `DbContext`,不在仓储外部直接持有 `AppDbContext`。 - 跨聚合的一致性通过 `IUnitOfWork` 事务保证。 ## 许可证 MIT License ## 贡献 欢迎提交 Issue 和 Pull Request!