Files
Environment-Monitoring-System/Report/ER图.md
ChuXun 02a830145e 1
2025-10-25 19:18:43 +08:00

18 KiB
Raw Blame History

3. ER图

erDiagram
    USER_ACCOUNT {
        BIGINT id PK
        VARCHAR username
        VARCHAR password
        VARCHAR email
        VARCHAR phone
        BIGINT role_id FK
        BIGINT grid_id FK
    }

    ROLE {
        BIGINT id PK
        VARCHAR name
    }

    FEEDBACK {
        BIGINT id PK
        TEXT content
        VARCHAR location
        VARCHAR status
        BIGINT submitter_id FK
    }

    TASK {
        BIGINT id PK
        TEXT description
        VARCHAR status
        BIGINT feedback_id FK
        BIGINT assignee_id FK
    }

    GRID {
        BIGINT id PK
        INT grid_x
        INT grid_y
    }

    OPERATION_LOG {
        BIGINT id PK
        VARCHAR operation_type
        TEXT details
        BIGINT operator_id FK
    }

    ATTACHMENT {
        BIGINT id PK
        BIGINT feedback_id FK
        VARCHAR file_url
    }

    USER_ACCOUNT ||--o{ ROLE : "has"
    USER_ACCOUNT ||--o{ FEEDBACK : "submits"
    USER_ACCOUNT ||--o{ TASK : "assigned"
    USER_ACCOUNT ||--o{ GRID : "belongs to"
    FEEDBACK ||--o{ TASK : "leads to"
    USER_ACCOUNT ||--o{ OPERATION_LOG : "performs"
    FEEDBACK ||--o{ ATTACHMENT : "has"
participant Database as 数据库

Admin->>+OperationLogController: GET /api/logs (过滤条件)
OperationLogController->>+OperationLogService: queryOperationLogs(filters)
OperationLogService->>+OperationLogRepository: findByCriteria(filters)
OperationLogRepository->>+Database: SELECT * FROM operation_logs WHERE ...
Database-->>-OperationLogRepository: 返回日志记录
OperationLogRepository-->>-OperationLogService: 返回日志DTO列表
OperationLogService-->>-OperationLogController: 返回日志DTO列表
OperationLogController-->>-Admin: 200 OK (日志列表)

### 1.16 管理员创建新用户

```mermaid
sequenceDiagram
    participant Admin as 管理员
    participant PersonnelController as 人员控制器
    participant PersonnelService as 人员服务
    participant UserAccountRepository as 用户账户仓库
    participant PasswordEncoder as 密码编码器
    participant Database as 数据库

    Admin->>+PersonnelController: POST /api/personnel/users (用户信息)
    PersonnelController->>+PersonnelService: createUser(request)
    PersonnelService->>+UserAccountRepository: findByUsername(username)
    UserAccountRepository-->>-PersonnelService: (检查用户是否存在)
    PersonnelService->>+PasswordEncoder: encode(password)
    PasswordEncoder-->>-PersonnelService: 返回加密后的密码
    PersonnelService->>+UserAccountRepository: save(user)
    UserAccountRepository->>+Database: INSERT INTO user_accounts
    Database-->>-UserAccountRepository: 返回已保存的用户
    UserAccountRepository-->>-PersonnelService: 返回已保存的用户
    PersonnelService-->>-PersonnelController: 返回创建的用户
    PersonnelController-->>-Admin: 201 CREATED (用户详情)

1.17 用户获取自己的反馈历史

sequenceDiagram
    participant User as 用户
    participant ProfileController as 个人资料控制器
    participant UserFeedbackService as 用户反馈服务
    participant CustomUserDetails as 用户认证详情
    participant Database as 数据库

    User->>+ProfileController: GET /api/me/feedback
    ProfileController->>+CustomUserDetails: 获取用户ID
    CustomUserDetails-->>-ProfileController: 返回用户ID
    ProfileController->>+UserFeedbackService: getFeedbackHistoryByUserId(userId, pageable)
    UserFeedbackService->>+Database: SELECT * FROM feedback WHERE user_id = ?
    Database-->>-UserFeedbackService: 返回反馈记录
    UserFeedbackService-->>-ProfileController: 返回反馈摘要DTO列表
    ProfileController-->>-User: 200 OK (反馈历史列表)

1.18 公众提交反馈

sequenceDiagram
    participant Public as 公众
    participant PublicController as 公共控制器
    participant FeedbackService as 反馈服务
    participant FileStorageService as 文件存储服务
    participant FeedbackRepository as 反馈仓库
    participant Database as 数据库

    Public->>+PublicController: POST /api/public/feedback (反馈信息和文件)
    PublicController->>+FeedbackService: createPublicFeedback(request, files)
    alt 如果有文件
        FeedbackService->>+FileStorageService: store(file)
        FileStorageService-->>-FeedbackService: 返回文件路径
    end
    FeedbackService->>+FeedbackRepository: save(feedback)
    FeedbackRepository->>+Database: INSERT INTO feedback
    Database-->>-FeedbackRepository: 返回已保存的反馈
    FeedbackRepository-->>-FeedbackService: 返回已保存的反馈
    FeedbackService-->>-PublicController: 返回创建的反馈
    PublicController-->>-Public: 201 CREATED (反馈详情)

1.19 分配任务给工作人员

sequenceDiagram
    participant Supervisor as 主管
    participant TaskAssignmentController as 任务分配控制器
    participant TaskAssignmentService as 任务分配服务
    participant AssignmentRepository as 分配仓库
    participant FeedbackRepository as 反馈仓库
    participant Database as 数据库

    Supervisor->>+TaskAssignmentController: POST /api/tasks/assign (任务ID, 分配对象ID)
    TaskAssignmentController->>+TaskAssignmentService: assignTask(feedbackId, assigneeId, assignerId)
    TaskAssignmentService->>+FeedbackRepository: findById(feedbackId)
    FeedbackRepository-->>-TaskAssignmentService: 返回任务详情
    TaskAssignmentService->>+AssignmentRepository: save(assignment)
    AssignmentRepository->>+Database: INSERT INTO assignments
    Database-->>-AssignmentRepository: 返回已保存的分配
    AssignmentRepository-->>-TaskAssignmentService: 返回已保存的分配
    TaskAssignmentService-->>-TaskAssignmentController: 返回新的分配
    TaskAssignmentController-->>-Supervisor: 200 OK (分配详情)

1.20 从反馈创建任务

sequenceDiagram
    participant Supervisor as 主管
    participant TaskManagementController as 任务管理控制器
    participant TaskManagementService as 任务管理服务
    participant FeedbackRepository as 反馈仓库
    participant TaskRepository as 任务仓库
    participant Database as 数据库

    Supervisor->>+TaskManagementController: POST /api/management/tasks/feedback/{feedbackId}/create-task (任务信息)
    TaskManagementController->>+TaskManagementService: createTaskFromFeedback(feedbackId, request)
    TaskManagementService->>+FeedbackRepository: findById(feedbackId)
    FeedbackRepository-->>-TaskManagementService: 返回反馈详情
    TaskManagementService->>+TaskRepository: save(task)
    TaskRepository->>+Database: INSERT INTO tasks
    Database-->>-TaskRepository: 返回已保存的任务
    TaskRepository-->>-TaskManagementService: 返回已保存的任务
    TaskManagementService-->>-TaskManagementController: 返回创建的任务详情DTO
    TaskManagementController-->>-Supervisor: 201 CREATED (任务详情)

2. UML类图

2.1 核心领域模型类图

classDiagram
    class UserAccount {
        -Long id
        -String name
        -String phone
        -String email
        -String password
        -Gender gender
        -Role role
        -UserStatus status
        -Level level
        -String department
        -List~String~ skills
        -LocalDateTime createdAt
        -LocalDateTime updatedAt
        +login() boolean
        +updateProfile() void
        +changePassword() void
    }

    class Feedback {
        -Long id
        -String eventId
        -String title
        -String description
        -PollutionType pollutionType
        -SeverityLevel severityLevel
        -FeedbackStatus status
        -String location
        -Double latitude
        -Double longitude
        -String cityName
        -String districtName
        -UserAccount submitter
        -LocalDateTime createdAt
        -LocalDateTime updatedAt
        +updateStatus() void
        +assignToTask() Task
    }

    class Task {
        -Long id
        -Feedback feedback
        -UserAccount assignee
        -UserAccount createdBy
        -TaskStatus status
        -String title
        -String description
        -String location
        -LocalDateTime assignedAt
        -LocalDateTime completedAt
        -LocalDateTime createdAt
        +assign(UserAccount) void
        +complete() void
        +updateProgress() void
    }

    class Assignment {
        -Long id
        -Task task
        -UserAccount assigner
        -LocalDateTime assignmentTime
        -LocalDateTime deadline
        -AssignmentStatus status
        -String remarks
        +setDeadline() void
        +updateStatus() void
    }

    class Grid {
        -Long id
        -Integer gridX
        -Integer gridY
        -String cityName
        -String districtName
        -String description
        -Boolean isObstacle
        +getCoordinates() Point
        +isAccessible() boolean
    }

    class Attachment {
        -Long id
        -String fileName
        -String filePath
        -String fileType
        -Long fileSize
        -LocalDateTime uploadedAt
    }

    class TaskHistory {
        -Long id
        -Task task
        -UserAccount updatedBy
        -TaskStatus oldStatus
        -TaskStatus newStatus
        -String remarks
        -LocalDateTime updatedAt
    }

    %% 枚举类
    class Role {
        <<enumeration>>
        PUBLIC_SUPERVISOR
        SUPERVISOR
        GRID_WORKER
        ADMIN
        DECISION_MAKER
    }

    class FeedbackStatus {
        <<enumeration>>
        PENDING_REVIEW
        AI_REVIEWING
        AI_PROCESSING
        PENDING_ASSIGNMENT
        ASSIGNED
        CONFIRMED
        RESOLVED
        REJECTED
    }

    class TaskStatus {
        <<enumeration>>
        PENDING_ASSIGNMENT
        ASSIGNED
        IN_PROGRESS
        SUBMITTED
        COMPLETED
        CANCELLED
    }

    class PollutionType {
        <<enumeration>>
        AIR
        WATER
        SOIL
        NOISE
        WASTE
        OTHER
    }

    class SeverityLevel {
        <<enumeration>>
        LOW
        MEDIUM
        HIGH
        CRITICAL
    }

    %% 关系
    UserAccount "1" -- "0..*" Feedback : submits
    UserAccount "1" -- "0..*" Task : assigned_to
    UserAccount "1" -- "0..*" Task : created_by
    UserAccount "1" -- "0..*" Assignment : assigns
    Feedback "1" -- "1" Task : generates
    Task "1" -- "1" Assignment : has
    Task "1" -- "0..*" TaskHistory : logs
    Feedback "1" -- "0..*" Attachment : has
    UserAccount -- Role
    Feedback -- FeedbackStatus
    Feedback -- PollutionType : categorized_as
    Feedback -- SeverityLevel : rated_as
    Task -- TaskStatus"}]}}}

2.2 控制器层类图

classDiagram
    class AuthController {
        -AuthService authService
        -VerificationCodeService verificationCodeService
        +signUp(SignUpRequest) ResponseEntity
        +signIn(LoginRequest) ResponseEntity
        +logout() ResponseEntity
        +sendVerificationCode(String) ResponseEntity
        +requestPasswordReset(String) ResponseEntity
        +resetPassword(PasswordResetRequest) ResponseEntity
    }

    class FeedbackController {
        -FeedbackService feedbackService
        +submitFeedback(FeedbackSubmissionRequest, MultipartFile[]) ResponseEntity
        +submitFeedbackJson(FeedbackSubmissionRequest) ResponseEntity
        +submitPublicFeedback(PublicFeedbackRequest, MultipartFile[]) ResponseEntity
        +getAllFeedback(filters, Pageable) ResponseEntity
        +getFeedbackById(Long) ResponseEntity
        +getFeedbackStats(filters) ResponseEntity
        +processFeedback(Long, ProcessFeedbackRequest) ResponseEntity
    }

    class UserController {
        -UserService userService
        +getCurrentUser() ResponseEntity
        +updateProfile(UserProfileUpdateRequest) ResponseEntity
        +getAllUsers(Pageable) ResponseEntity
        +getUserById(Long) ResponseEntity
        +updateUserRole(Long, Role) ResponseEntity
        +deactivateUser(Long) ResponseEntity
    }

    %% 服务层接口
    class AuthService {
        <<interface>>
        +registerUser(SignUpRequest) void
        +signIn(LoginRequest) JwtAuthenticationResponse
        +logout() void
        +requestPasswordReset(String) void
        +resetPassword(String, String) void
    }

    class FeedbackService {
        <<interface>>
        +submitFeedback(FeedbackSubmissionRequest, MultipartFile[]) Feedback
        +getAllFeedback(filters, Pageable) Page~Feedback~
        +getFeedbackById(Long) Feedback
        +processFeedback(Long, ProcessFeedbackRequest) Feedback
        +getFeedbackStats(filters) FeedbackStatsResponse
    }

    %% 关系
    AuthController --> AuthService : uses
    FeedbackController --> FeedbackService : uses
    UserController --> UserService : uses

2.3 服务层实现类图

classDiagram
    class AuthServiceImpl {
        -UserRepository userRepository
        -PasswordEncoder passwordEncoder
        -JwtService jwtService
        -VerificationCodeService verificationCodeService
        +registerUser(SignUpRequest) void
        +signIn(LoginRequest) JwtAuthenticationResponse
        +logout() void
        +requestPasswordReset(String) void
        +resetPassword(String, String) void
        -validateUser(UserAccount) void
        -generateJwtToken(UserAccount) String
    }

    class FeedbackServiceImpl {
        -FeedbackRepository feedbackRepository
        -UserRepository userRepository
        -ApplicationEventPublisher eventPublisher
        -FileStorageService fileStorageService
        +submitFeedback(FeedbackSubmissionRequest, MultipartFile[]) Feedback
        +getAllFeedback(filters, Pageable) Page~Feedback~
        +getFeedbackById(Long) Feedback
        +processFeedback(Long, ProcessFeedbackRequest) Feedback
        -generateEventId() String
        -validateFeedbackData(FeedbackSubmissionRequest) void
    }

    class TaskServiceImpl {
        -TaskRepository taskRepository
        -UserRepository userRepository
        -AssignmentRepository assignmentRepository
        +createTask(TaskCreationRequest) Task
        +assignTask(Long, Long) Assignment
        +updateTaskStatus(Long, TaskStatus) Task
        +getTasksByAssignee(Long, Pageable) Page~Task~
        -validateTaskAssignment(Task, UserAccount) void
    }

    %% 接口实现关系
    AuthServiceImpl ..|> AuthService : implements
    FeedbackServiceImpl ..|> FeedbackService : implements
    TaskServiceImpl ..|> TaskService : implements

3. 数据库ER图

erDiagram
    USER_ACCOUNT {
        bigint id PK
        varchar name
        varchar phone UK
        varchar email UK
        varchar password
        enum gender
        enum role
        enum status
        enum level
        varchar department
        text skills
        datetime created_at
        datetime updated_at
    }

    FEEDBACK {
        bigint id PK
        varchar event_id UK
        varchar title
        text description
        enum pollution_type
        enum severity_level
        enum status
        varchar location
        decimal latitude
        decimal longitude
        varchar city_name
        varchar district_name
        bigint submitter_id FK
        datetime created_at
        datetime updated_at
    }

    TASK {
        bigint id PK
        bigint feedback_id FK
        bigint assignee_id FK
        bigint created_by FK
        enum status
        varchar title
        text description
        varchar location
        decimal latitude
        decimal longitude
        datetime assigned_at
        datetime completed_at
        datetime created_at
        datetime updated_at
    }

    ASSIGNMENT {
        bigint id PK
        bigint task_id FK
        bigint assigner_id FK
        datetime assignment_time
        datetime deadline
        enum status
        text remarks
        datetime created_at
        datetime updated_at
    }

    GRID {
        bigint id PK
        int gridx
        int gridy
        varchar city_name
        varchar district_name
        text description
        boolean is_obstacle
    }

    ATTACHMENT {
        bigint id PK
        bigint feedback_id FK
        varchar file_name
        varchar file_path
        varchar file_type
        bigint file_size
        datetime uploaded_at
    }

    OPERATION_LOG {
        bigint id PK
        bigint user_id FK
        varchar operation_type
        varchar target_type
        bigint target_id
        text description
        varchar ip_address
        datetime created_at
    }

    VERIFICATION_CODE {
        bigint id PK
        varchar email
        varchar code
        enum type
        datetime expires_at
        boolean used
        datetime created_at
    }

    TASK_HISTORY {
        bigint id PK
        bigint task_id FK
        bigint updated_by_id FK
        enum old_status
        enum new_status
        text remarks
        datetime updated_at
    }

    %% 关系定义
    USER_ACCOUNT ||--o{ FEEDBACK : submits
    USER_ACCOUNT ||--o{ TASK : assigned_to
    USER_ACCOUNT ||--o{ TASK : created_by
    USER_ACCOUNT ||--o{ ASSIGNMENT : assigns
    USER_ACCOUNT ||--o{ OPERATION_LOG : performs
    
    FEEDBACK ||--|| TASK : generates
    FEEDBACK ||--o{ ATTACHMENT : has

    TASK ||--|| ASSIGNMENT : has
    TASK ||--o{ TASK_HISTORY : logs

    VERIFICATION_CODE }o--|| USER_ACCOUNT : sent_to
    USER_ACCOUNT ||--o{ TASK_HISTORY : updates

4. 系统架构说明

4.1 分层架构

  • 控制器层(Controller): 处理HTTP请求参数验证响应格式化
  • 服务层(Service): 业务逻辑处理,事务管理
  • 仓库层(Repository): 数据访问,数据库操作
  • 模型层(Model): 实体定义,数据结构

4.2 核心业务流程

  1. 用户认证: JWT令牌生成和验证
  2. 反馈管理: 环境问题反馈的提交、审核、处理
  3. 任务分配: 基于反馈创建任务并分配给网格工作人员
  4. 状态跟踪: 反馈和任务状态的生命周期管理

4.3 安全机制

  • 基于角色的访问控制(RBAC)
  • JWT令牌认证
  • 密码加密存储
  • 操作日志记录

4.4 数据完整性

  • 外键约束确保数据一致性
  • 唯一约束防止重复数据
  • 枚举类型确保状态值有效性
  • 时间戳记录数据变更历史

5. 技术栈

  • 框架: Spring Boot 3.x
  • 数据库: MySQL/PostgreSQL
  • ORM: Spring Data JPA + Hibernate
  • 安全: Spring Security + JWT
  • 文档: Swagger/OpenAPI 3
  • 构建工具: Maven
  • Java版本: JDK 17+

本文档基于EMS后端项目代码分析生成包含完整的系统设计图表可用于系统理解、开发指导和文档维护。