# Authorization Service 架构文档 ## 目录 1. [概述](#概述) 2. [架构设计](#架构设计) 3. [分层架构](#分层架构) 4. [领域模型](#领域模型) 5. [技术栈](#技术栈) 6. [目录结构](#目录结构) --- ## 概述 Authorization Service(授权服务)是 RWAdurian 平台的核心微服务之一,负责管理用户的授权角色,包括省代公司、市代公司和社区授权。该服务采用 **领域驱动设计(DDD)** 和 **六边形架构(Hexagonal Architecture)** 模式构建,确保业务逻辑的清晰性和系统的可维护性。 ### 核心功能 - **授权角色管理**:省代公司、市代公司、社区授权的申请、审核、激活和撤销 - **月度考核评估**:基于阶梯目标的月度业绩考核和排名 - **团队验证**:推荐链路中的授权冲突检测 - **事件驱动**:通过 Kafka 发布领域事件,实现服务间解耦 --- ## 架构设计 ### 六边形架构(端口与适配器) ``` ┌─────────────────────────────────────────┐ │ API Layer │ │ (Controllers, DTOs, Guards) │ └──────────────────┬──────────────────────┘ │ ┌──────────────────▼──────────────────────┐ │ Application Layer │ │ (Commands, Services, Schedulers) │ └──────────────────┬──────────────────────┘ │ ┌──────────────────────────────────▼──────────────────────────────────┐ │ Domain Layer │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐│ │ │ Aggregates │ │ Entities │ │Value Objects│ │ Events ││ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ Repositories│ │ Services │ │ Enums │ │ │ │ (Interfaces)│ │ (Domain) │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ └──────────────────────────────────┬──────────────────────────────────┘ │ ┌──────────────────▼──────────────────────┐ │ Infrastructure Layer │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ Prisma │ │ Redis │ │ │ │ Repositories│ │ Cache │ │ │ └─────────────┘ └─────────────┘ │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ Kafka │ │ External │ │ │ │ Publisher │ │ Services │ │ │ └─────────────┘ └─────────────┘ │ └─────────────────────────────────────────┘ ``` ### 依赖方向 - 外层依赖内层,内层不依赖外层 - Domain Layer 是核心,不依赖任何外部框架 - Infrastructure Layer 实现 Domain Layer 定义的接口 - Application Layer 编排领域对象完成用例 --- ## 分层架构 ### 1. Domain Layer(领域层) 领域层是系统的核心,包含所有业务逻辑。 #### 聚合根(Aggregates) | 聚合根 | 说明 | |--------|------| | `AuthorizationRole` | 授权角色聚合根,管理授权的完整生命周期 | | `MonthlyAssessment` | 月度考核聚合根,管理考核评估和排名 | #### 实体(Entities) | 实体 | 说明 | |------|------| | `LadderTargetRule` | 阶梯目标规则,定义省代/市代/社区的考核目标 | #### 值对象(Value Objects) | 值对象 | 说明 | |--------|------| | `AuthorizationId` | 授权ID | | `AssessmentId` | 考核ID | | `UserId` | 用户ID | | `AdminUserId` | 管理员用户ID | | `RegionCode` | 区域代码(省/市) | | `Month` | 月份(YYYY-MM格式) | | `ValidationResult` | 验证结果 | #### 领域服务(Domain Services) | 服务 | 说明 | |------|------| | `AuthorizationValidatorService` | 授权验证服务,检查推荐链路冲突 | | `AssessmentCalculatorService` | 考核计算服务,计算业绩和排名 | #### 领域事件(Domain Events) | 事件 | 触发时机 | |------|----------| | `AuthorizationAppliedEvent` | 授权申请提交 | | `AuthorizationApprovedEvent` | 授权审核通过 | | `AuthorizationRejectedEvent` | 授权审核拒绝 | | `AuthorizationActivatedEvent` | 授权激活 | | `AuthorizationRevokedEvent` | 授权撤销 | | `MonthlyAssessmentPassedEvent` | 月度考核通过 | | `MonthlyAssessmentFailedEvent` | 月度考核失败 | | `MonthlyBypassGrantedEvent` | 授予考核豁免 | | `FirstPlaceAchievedEvent` | 获得区域第一名 | ### 2. Application Layer(应用层) 应用层负责编排领域对象,实现用例。 #### 命令(Commands) ```typescript // 用户命令 ApplyProvincialAuthorizationCommand // 申请省代授权 ApplyCityAuthorizationCommand // 申请市代授权 ApplyCommunityAuthorizationCommand // 申请社区授权 // 管理员命令 AdminApproveAuthorizationCommand // 审核通过 AdminRejectAuthorizationCommand // 审核拒绝 AdminRevokeAuthorizationCommand // 撤销授权 AdminGrantBypassCommand // 授予豁免 // 系统命令 RunMonthlyAssessmentCommand // 执行月度考核 ``` #### 应用服务(Application Services) | 服务 | 说明 | |------|------| | `AuthorizationCommandService` | 处理授权相关命令 | | `AuthorizationQueryService` | 处理授权相关查询 | | `AssessmentCommandService` | 处理考核相关命令 | | `AssessmentQueryService` | 处理考核相关查询 | #### 定时任务(Schedulers) | 任务 | 说明 | |------|------| | `MonthlyAssessmentScheduler` | 每月1日执行上月考核 | ### 3. Infrastructure Layer(基础设施层) 基础设施层提供技术实现。 #### 持久化(Persistence) - **Prisma ORM**:PostgreSQL 数据库访问 - **Repository 实现**:实现领域层定义的仓储接口 #### 缓存(Cache) - **Redis**:缓存热点数据,如用户授权信息 #### 消息队列(Messaging) - **Kafka**:发布领域事件到其他服务 #### 外部服务(External Services) - **Identity Service**:用户身份验证 - **Referral Service**:推荐关系查询 - **Statistics Service**:团队统计数据查询 ### 4. API Layer(接口层) API 层处理 HTTP 请求和响应。 #### 控制器(Controllers) | 控制器 | 路由前缀 | 说明 | |--------|----------|------| | `AuthorizationController` | `/authorizations` | 用户授权操作 | | `AdminAuthorizationController` | `/admin/authorizations` | 管理员授权操作 | | `AssessmentController` | `/assessments` | 考核查询 | | `AdminAssessmentController` | `/admin/assessments` | 管理员考核操作 | --- ## 领域模型 ### 授权角色状态机 ``` ┌─────────┐ │ PENDING │ ◄─── 用户申请 └────┬────┘ │ ┌───────┴───────┐ ▼ ▼ ┌─────────┐ ┌──────────┐ │APPROVED │ │ REJECTED │ └────┬────┘ └──────────┘ │ ▼ ┌─────────┐ │ ACTIVE │ ◄─── 首月考核通过后激活 └────┬────┘ │ ▼ ┌─────────┐ │ REVOKED │ ◄─── 管理员撤销或考核失败 └─────────┘ ``` ### 考核规则 #### 省代公司阶梯目标 | 月份 | 月度目标 | 累计目标 | |------|----------|----------| | 1 | 150 | 150 | | 2 | 300 | 450 | | 3 | 600 | 1,050 | | 4 | 1,200 | 2,250 | | 5 | 2,400 | 4,650 | | 6 | 4,700 | 9,350 | | 7 | 6,900 | 16,250 | | 8 | 10,000 | 26,250 | | 9+ | 11,750 | 50,000 | #### 市代公司阶梯目标 | 月份 | 月度目标 | 累计目标 | |------|----------|----------| | 1 | 30 | 30 | | 2 | 60 | 90 | | 3 | 120 | 210 | | 4 | 240 | 450 | | 5 | 480 | 930 | | 6 | 940 | 1,870 | | 7 | 1,380 | 3,250 | | 8 | 2,000 | 5,250 | | 9+ | 2,350 | 10,000 | #### 社区授权目标 固定目标:10(无阶梯) --- ## 技术栈 | 技术 | 用途 | |------|------| | **NestJS** | Node.js 后端框架 | | **TypeScript** | 编程语言 | | **Prisma** | ORM 数据库访问 | | **PostgreSQL** | 关系型数据库 | | **Redis** | 缓存 | | **Kafka** | 消息队列 | | **Jest** | 测试框架 | | **Docker** | 容器化部署 | --- ## 目录结构 ``` authorization-service/ ├── src/ │ ├── domain/ # 领域层 │ │ ├── aggregates/ # 聚合根 │ │ │ ├── authorization-role.aggregate.ts │ │ │ └── monthly-assessment.aggregate.ts │ │ ├── entities/ # 实体 │ │ │ └── ladder-target-rule.entity.ts │ │ ├── value-objects/ # 值对象 │ │ │ ├── authorization-id.vo.ts │ │ │ ├── assessment-id.vo.ts │ │ │ ├── user-id.vo.ts │ │ │ ├── region-code.vo.ts │ │ │ ├── month.vo.ts │ │ │ └── validation-result.vo.ts │ │ ├── events/ # 领域事件 │ │ │ ├── authorization-applied.event.ts │ │ │ ├── authorization-approved.event.ts │ │ │ └── ... │ │ ├── services/ # 领域服务 │ │ │ ├── authorization-validator.service.ts │ │ │ └── assessment-calculator.service.ts │ │ ├── repositories/ # 仓储接口 │ │ │ ├── authorization-role.repository.ts │ │ │ └── monthly-assessment.repository.ts │ │ └── enums/ # 枚举 │ │ ├── role-type.enum.ts │ │ ├── authorization-status.enum.ts │ │ └── assessment-result.enum.ts │ │ │ ├── application/ # 应用层 │ │ ├── commands/ # 命令 │ │ │ ├── apply-provincial-authorization.command.ts │ │ │ └── ... │ │ ├── services/ # 应用服务 │ │ │ ├── authorization-command.service.ts │ │ │ ├── authorization-query.service.ts │ │ │ ├── assessment-command.service.ts │ │ │ └── assessment-query.service.ts │ │ └── schedulers/ # 定时任务 │ │ └── monthly-assessment.scheduler.ts │ │ │ ├── infrastructure/ # 基础设施层 │ │ ├── persistence/ # 持久化 │ │ │ ├── prisma/ │ │ │ │ └── prisma.service.ts │ │ │ └── repositories/ # 仓储实现 │ │ │ ├── authorization-role.repository.impl.ts │ │ │ └── monthly-assessment.repository.impl.ts │ │ ├── cache/ # 缓存 │ │ │ └── redis.service.ts │ │ ├── messaging/ # 消息队列 │ │ │ └── kafka/ │ │ │ └── event-publisher.service.ts │ │ └── external/ # 外部服务 │ │ ├── referral.service.ts │ │ └── statistics.service.ts │ │ │ ├── api/ # 接口层 │ │ ├── controllers/ # 控制器 │ │ │ ├── authorization.controller.ts │ │ │ ├── admin-authorization.controller.ts │ │ │ ├── assessment.controller.ts │ │ │ └── admin-assessment.controller.ts │ │ ├── dtos/ # 数据传输对象 │ │ │ ├── apply-authorization.dto.ts │ │ │ └── ... │ │ └── guards/ # 守卫 │ │ ├── jwt-auth.guard.ts │ │ └── admin.guard.ts │ │ │ ├── shared/ # 共享模块 │ │ ├── filters/ # 异常过滤器 │ │ │ └── global-exception.filter.ts │ │ ├── interceptors/ # 拦截器 │ │ │ └── transform.interceptor.ts │ │ └── exceptions/ # 自定义异常 │ │ └── domain.exception.ts │ │ │ ├── app.module.ts # 应用模块 │ └── main.ts # 入口文件 │ ├── prisma/ │ ├── schema.prisma # 数据库模型 │ └── migrations/ # 数据库迁移 │ ├── test/ # 测试 │ ├── app.e2e-spec.ts # E2E 测试 │ └── domain-services.integration-spec.ts # 集成测试 │ ├── docs/ # 文档 │ ├── ARCHITECTURE.md # 架构文档 │ ├── API.md # API 文档 │ ├── DEVELOPMENT.md # 开发指南 │ ├── TESTING.md # 测试文档 │ └── DEPLOYMENT.md # 部署文档 │ ├── docker-compose.test.yml # 测试环境配置 ├── Dockerfile # 生产镜像 ├── Dockerfile.test # 测试镜像 ├── Makefile # 常用命令 └── package.json # 项目配置 ``` --- ## 参考资料 - [Domain-Driven Design Reference](https://www.domainlanguage.com/ddd/reference/) - [Hexagonal Architecture](https://alistair.cockburn.us/hexagonal-architecture/) - [NestJS Documentation](https://docs.nestjs.com/) - [Prisma Documentation](https://www.prisma.io/docs/)