18 KiB
18 KiB
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 核心业务流程
- 用户认证: JWT令牌生成和验证
- 反馈管理: 环境问题反馈的提交、审核、处理
- 任务分配: 基于反馈创建任务并分配给网格工作人员
- 状态跟踪: 反馈和任务状态的生命周期管理
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后端项目代码分析生成,包含完整的系统设计图表,可用于系统理解、开发指导和文档维护。