清理
This commit is contained in:
2
ems-backend/.gitattributes
vendored
2
ems-backend/.gitattributes
vendored
@@ -1,2 +0,0 @@
|
||||
/mvnw text eol=lf
|
||||
*.cmd text eol=crlf
|
||||
33
ems-backend/.gitignore
vendored
33
ems-backend/.gitignore
vendored
@@ -1,33 +0,0 @@
|
||||
HELP.md
|
||||
target/
|
||||
.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
|
||||
### STS ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
Binary file not shown.
@@ -1,54 +0,0 @@
|
||||
# EMS后端项目概览
|
||||
|
||||
## 项目简介
|
||||
EMS (Environmental Monitoring System) 后端是一个基于Spring Boot 3.5.0的环境监测管理系统后端服务,使用Java 17开发。该系统采用自定义JSON文件存储方案,不依赖传统关系型数据库。
|
||||
|
||||
## 技术栈
|
||||
- **框架**: Spring Boot 3.5.0
|
||||
- **Java版本**: Java 17
|
||||
- **构建工具**: Maven
|
||||
- **数据存储**: 自定义JSON文件存储
|
||||
- **安全认证**: Spring Security + JWT
|
||||
- **API文档**: Swagger UI (SpringDoc OpenAPI)
|
||||
- **邮件服务**: Spring Mail (163 SMTP)
|
||||
- **异步处理**: Spring Async
|
||||
- **WebSocket**: Spring WebSocket
|
||||
- **工具库**: Lombok, Google Guava
|
||||
|
||||
## 核心特性
|
||||
1. **无数据库设计**: 使用JSON文件作为数据持久化方案
|
||||
2. **JWT认证**: 基于Token的无状态认证
|
||||
3. **异步处理**: 支持异步任务执行
|
||||
4. **事件驱动**: 使用Spring Events进行组件解耦
|
||||
5. **AI集成**: 集成火山引擎AI服务
|
||||
6. **文件上传**: 支持文件上传和管理
|
||||
7. **邮件通知**: 集成邮件发送功能
|
||||
8. **实时通信**: WebSocket支持
|
||||
|
||||
## 项目结构
|
||||
```
|
||||
src/main/java/com/dne/ems/
|
||||
├── config/ # 配置类
|
||||
├── controller/ # REST控制器
|
||||
├── dto/ # 数据传输对象
|
||||
├── event/ # 事件定义
|
||||
├── exception/ # 异常处理
|
||||
├── listener/ # 事件监听器
|
||||
├── model/ # 数据模型
|
||||
├── repository/ # 数据访问层
|
||||
├── security/ # 安全配置
|
||||
├── service/ # 业务逻辑层
|
||||
└── validation/ # 数据验证
|
||||
```
|
||||
|
||||
## 数据存储文件
|
||||
- `users.json` - 用户数据
|
||||
- `feedbacks.json` - 反馈数据
|
||||
- `tasks.json` - 任务数据
|
||||
- `grids.json` - 网格数据
|
||||
- `assignments.json` - 分配记录
|
||||
- `aqi_records.json` - 空气质量数据
|
||||
- `operation_logs.json` - 操作日志
|
||||
- `attachments.json` - 附件信息
|
||||
- `map_grids.json` - 地图网格数据
|
||||
- `pollutant_thresholds.json` - 污染物阈值
|
||||
@@ -1,193 +0,0 @@
|
||||
# EMS后端业务逻辑与核心功能
|
||||
|
||||
## 核心业务模块
|
||||
|
||||
### 1. 用户管理模块
|
||||
**控制器**: `AuthController`, `PersonnelController`, `ProfileController`
|
||||
**核心功能**:
|
||||
- 用户注册、登录、注销
|
||||
- JWT Token生成和验证
|
||||
- 密码重置(邮件验证码)
|
||||
- 用户信息管理
|
||||
- 角色权限控制
|
||||
|
||||
**用户角色**:
|
||||
- `ADMIN`: 系统管理员
|
||||
- `SUPERVISOR`: 主管
|
||||
- `GRID_WORKER`: 网格员
|
||||
- `PUBLIC`: 公众用户
|
||||
|
||||
### 2. 反馈管理模块
|
||||
**控制器**: `FeedbackController`, `PublicController`
|
||||
**核心功能**:
|
||||
- 公众反馈提交
|
||||
- 反馈审核和处理
|
||||
- AI智能审核集成
|
||||
- 反馈状态跟踪
|
||||
- 反馈统计分析
|
||||
|
||||
**反馈状态流程**:
|
||||
```
|
||||
PENDING → AI_REVIEWING → APPROVED/REJECTED → TASK_CREATED
|
||||
```
|
||||
|
||||
### 3. 任务管理模块
|
||||
**控制器**: `TaskManagementController`, `TaskAssignmentController`, `GridWorkerTaskController`, `SupervisorController`
|
||||
**核心功能**:
|
||||
- 任务创建和分配
|
||||
- 任务执行跟踪
|
||||
- 任务审核和验收
|
||||
- 任务统计报告
|
||||
- 自动任务分配算法
|
||||
|
||||
**任务状态流程**:
|
||||
```
|
||||
CREATED → ASSIGNED → IN_PROGRESS → SUBMITTED → APPROVED/REJECTED
|
||||
```
|
||||
|
||||
### 4. 网格管理模块
|
||||
**控制器**: `GridController`, `MapController`
|
||||
**核心功能**:
|
||||
- 网格区域划分
|
||||
- 网格员分配
|
||||
- 网格覆盖率统计
|
||||
- 地图可视化
|
||||
- 路径规划算法
|
||||
|
||||
### 5. 数据分析模块
|
||||
**控制器**: `DashboardController`
|
||||
**核心功能**:
|
||||
- 实时数据统计
|
||||
- 趋势分析
|
||||
- 热力图生成
|
||||
- AQI数据处理
|
||||
- 污染物阈值监控
|
||||
|
||||
### 6. 文件管理模块
|
||||
**控制器**: `FileController`
|
||||
**核心功能**:
|
||||
- 文件上传和下载
|
||||
- 图片处理
|
||||
- 附件管理
|
||||
- 文件安全检查
|
||||
|
||||
## 数据模型设计
|
||||
|
||||
### 核心实体
|
||||
1. **User**: 用户信息
|
||||
- 基本信息:姓名、邮箱、电话
|
||||
- 认证信息:密码、角色
|
||||
- 位置信息:经纬度
|
||||
|
||||
2. **Feedback**: 反馈信息
|
||||
- 内容:标题、描述、类型
|
||||
- 状态:处理状态、优先级
|
||||
- 位置:经纬度、地址
|
||||
- 附件:图片、文件
|
||||
|
||||
3. **Task**: 任务信息
|
||||
- 基本信息:标题、描述、类型
|
||||
- 分配信息:分配人、执行人
|
||||
- 时间信息:创建时间、截止时间
|
||||
- 状态:任务状态、完成度
|
||||
|
||||
4. **Grid**: 网格信息
|
||||
- 区域信息:边界坐标、面积
|
||||
- 分配信息:负责人、覆盖状态
|
||||
- 统计信息:任务数量、完成率
|
||||
|
||||
5. **Assignment**: 分配记录
|
||||
- 分配信息:任务ID、用户ID
|
||||
- 时间信息:分配时间、完成时间
|
||||
- 状态:分配状态、完成状态
|
||||
|
||||
## 业务规则
|
||||
|
||||
### 权限控制规则
|
||||
1. **ADMIN**: 全系统权限
|
||||
2. **SUPERVISOR**: 管理网格员,审核任务
|
||||
3. **GRID_WORKER**: 执行分配的任务
|
||||
4. **PUBLIC**: 仅能提交反馈
|
||||
|
||||
### 任务分配规则
|
||||
1. 基于网格区域自动分配
|
||||
2. 考虑网格员工作负载
|
||||
3. 紧急任务优先分配
|
||||
4. 支持手动重新分配
|
||||
|
||||
### 反馈处理规则
|
||||
1. AI预审核筛选
|
||||
2. 重复反馈合并
|
||||
3. 紧急反馈优先处理
|
||||
4. 自动生成处理任务
|
||||
|
||||
## 集成服务
|
||||
|
||||
### AI服务集成
|
||||
**服务**: 火山引擎AI
|
||||
**功能**:
|
||||
- 反馈内容智能分析
|
||||
- 自动分类和优先级评估
|
||||
- 处理建议生成
|
||||
|
||||
### 邮件服务
|
||||
**服务**: 163 SMTP
|
||||
**功能**:
|
||||
- 密码重置邮件
|
||||
- 任务通知邮件
|
||||
- 系统通知邮件
|
||||
|
||||
### 文件存储
|
||||
**方案**: 本地文件系统
|
||||
**目录**: `./uploads/`
|
||||
**支持格式**: 图片、文档
|
||||
|
||||
## 事件驱动架构
|
||||
|
||||
### 核心事件
|
||||
1. **FeedbackSubmittedForAiReviewEvent**: 反馈提交AI审核
|
||||
2. **TaskReadyForAssignmentEvent**: 任务准备分配
|
||||
3. **AuthenticationSuccessEvent**: 登录成功
|
||||
4. **AuthenticationFailureEvent**: 登录失败
|
||||
|
||||
### 事件处理
|
||||
- 异步事件处理
|
||||
- 事件监听器解耦
|
||||
- 支持事件重试机制
|
||||
|
||||
## 性能优化策略
|
||||
|
||||
### 缓存策略
|
||||
1. 用户信息缓存
|
||||
2. 网格数据缓存
|
||||
3. 统计数据缓存
|
||||
4. 配置信息缓存
|
||||
|
||||
### 异步处理
|
||||
1. AI审核异步化
|
||||
2. 邮件发送异步化
|
||||
3. 文件处理异步化
|
||||
4. 统计计算异步化
|
||||
|
||||
### 数据优化
|
||||
1. JSON文件分片存储
|
||||
2. 索引优化
|
||||
3. 分页查询
|
||||
4. 数据压缩
|
||||
|
||||
## 监控和日志
|
||||
|
||||
### 操作日志
|
||||
- 用户操作记录
|
||||
- 系统关键操作
|
||||
- 异常操作告警
|
||||
|
||||
### 性能监控
|
||||
- API响应时间
|
||||
- 系统资源使用
|
||||
- 错误率统计
|
||||
|
||||
### 业务监控
|
||||
- 反馈处理效率
|
||||
- 任务完成率
|
||||
- 用户活跃度
|
||||
@@ -1,142 +0,0 @@
|
||||
# EMS后端代码风格与架构设计
|
||||
|
||||
## 代码风格规范
|
||||
|
||||
### Java编码规范
|
||||
1. **包命名**: 使用`com.dne.ems`作为根包
|
||||
2. **类命名**: 使用PascalCase,如`AuthController`、`UserService`
|
||||
3. **方法命名**: 使用camelCase,如`getUserById`、`createTask`
|
||||
4. **常量命名**: 使用UPPER_SNAKE_CASE
|
||||
5. **变量命名**: 使用camelCase
|
||||
|
||||
### 注解使用
|
||||
- **Lombok**: 广泛使用`@Data`、`@Builder`、`@NoArgsConstructor`等
|
||||
- **Spring**: 使用`@RestController`、`@Service`、`@Repository`等
|
||||
- **验证**: 使用`@Valid`、`@NotNull`、`@Size`等JSR-303注解
|
||||
- **文档**: 使用Javadoc注释,特别是公共API
|
||||
|
||||
### 文件组织
|
||||
```
|
||||
com.dne.ems/
|
||||
├── config/ # 配置类,如WebConfig、SecurityConfig
|
||||
├── controller/ # REST控制器,处理HTTP请求
|
||||
├── dto/ # 数据传输对象,用于API交互
|
||||
├── event/ # 事件定义,用于解耦组件
|
||||
├── exception/ # 自定义异常和全局异常处理
|
||||
├── listener/ # 事件监听器
|
||||
├── model/ # 数据模型和实体类
|
||||
├── repository/ # 数据访问层,JSON文件操作
|
||||
├── security/ # 安全相关配置和工具
|
||||
├── service/ # 业务逻辑层
|
||||
└── validation/ # 自定义验证器
|
||||
```
|
||||
|
||||
## 架构设计原则
|
||||
|
||||
### 分层架构
|
||||
1. **Controller层**: 处理HTTP请求,参数验证,调用Service
|
||||
2. **Service层**: 业务逻辑处理,事务管理
|
||||
3. **Repository层**: 数据访问,JSON文件操作
|
||||
4. **Model层**: 数据模型定义
|
||||
|
||||
### 设计模式
|
||||
1. **依赖注入**: 使用Spring的IoC容器
|
||||
2. **事件驱动**: 使用Spring Events解耦组件
|
||||
3. **Builder模式**: 使用Lombok的@Builder
|
||||
4. **策略模式**: 在业务逻辑中使用
|
||||
|
||||
### JSON数据存储设计
|
||||
- 每个实体对应一个JSON文件
|
||||
- 使用Repository模式封装文件操作
|
||||
- 实现类似JPA的CRUD操作
|
||||
- 支持分页和排序
|
||||
|
||||
## 安全设计
|
||||
|
||||
### JWT认证
|
||||
- 使用JWT Token进行无状态认证
|
||||
- Token包含用户ID、角色等信息
|
||||
- 设置合理的过期时间
|
||||
|
||||
### 权限控制
|
||||
- 基于角色的访问控制(RBAC)
|
||||
- 使用Spring Security的方法级安全
|
||||
- 支持多种用户角色:ADMIN、SUPERVISOR、GRID_WORKER、PUBLIC
|
||||
|
||||
## 异常处理
|
||||
|
||||
### 全局异常处理
|
||||
- 使用`@ControllerAdvice`统一处理异常
|
||||
- 返回标准化的错误响应格式
|
||||
- 记录详细的错误日志
|
||||
|
||||
### 自定义异常
|
||||
- `ResourceNotFoundException`: 资源未找到
|
||||
- `InvalidOperationException`: 非法操作
|
||||
- `UserAlreadyExistsException`: 用户已存在
|
||||
- `FileStorageException`: 文件存储异常
|
||||
|
||||
## API设计规范
|
||||
|
||||
### RESTful设计
|
||||
- 使用标准HTTP方法:GET、POST、PUT、DELETE
|
||||
- 资源命名使用复数形式
|
||||
- 使用HTTP状态码表示操作结果
|
||||
|
||||
### 响应格式
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"data": {},
|
||||
"message": "操作成功",
|
||||
"timestamp": "2025-01-XX"
|
||||
}
|
||||
```
|
||||
|
||||
### 分页响应
|
||||
```json
|
||||
{
|
||||
"content": [],
|
||||
"totalElements": 100,
|
||||
"totalPages": 10,
|
||||
"size": 10,
|
||||
"number": 0
|
||||
}
|
||||
```
|
||||
|
||||
## 性能优化
|
||||
|
||||
### 缓存策略
|
||||
- 使用Google Guava进行内存缓存
|
||||
- 缓存频繁访问的数据
|
||||
- 设置合理的缓存过期时间
|
||||
|
||||
### 异步处理
|
||||
- 使用`@Async`注解处理耗时操作
|
||||
- 配置线程池参数
|
||||
- 事件处理异步化
|
||||
|
||||
## 日志规范
|
||||
|
||||
### 日志级别
|
||||
- ERROR: 系统错误,需要立即处理
|
||||
- WARN: 警告信息,可能的问题
|
||||
- INFO: 重要的业务流程信息
|
||||
- DEBUG: 调试信息,开发环境使用
|
||||
|
||||
### 日志内容
|
||||
- 包含请求ID便于追踪
|
||||
- 记录关键业务操作
|
||||
- 敏感信息脱敏处理
|
||||
|
||||
## 测试规范
|
||||
|
||||
### 单元测试
|
||||
- 使用JUnit 5
|
||||
- Service层测试覆盖率>80%
|
||||
- 使用Mockito进行依赖模拟
|
||||
|
||||
### 集成测试
|
||||
- 使用Spring Boot Test
|
||||
- 测试完整的API流程
|
||||
- 使用测试数据库或文件
|
||||
@@ -1,207 +0,0 @@
|
||||
# EMS后端控制器实现详解
|
||||
|
||||
## 控制器架构概览
|
||||
|
||||
基于之前的分析,现在补充实际的控制器实现细节。项目采用标准的Spring MVC架构,所有控制器都位于`com.dne.ems.controller`包下。
|
||||
|
||||
## 核心控制器实现
|
||||
|
||||
### 1. AuthController - 认证控制器
|
||||
|
||||
**位置**: `src/main/java/com/dne/ems/controller/AuthController.java`
|
||||
|
||||
**主要功能**:
|
||||
- 用户注册 (`/api/auth/signup`)
|
||||
- 用户登录 (`/api/auth/login`)
|
||||
- 用户登出 (`/api/auth/logout`)
|
||||
- 发送验证码 (`/api/auth/send-verification-code`)
|
||||
- 密码重置 (`/api/auth/reset-password-with-code`)
|
||||
|
||||
**关键特性**:
|
||||
```java
|
||||
@RestController
|
||||
@RequestMapping("/api/auth")
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class AuthController {
|
||||
private final AuthService authService;
|
||||
private final VerificationCodeService verificationCodeService;
|
||||
private final OperationLogService operationLogService;
|
||||
}
|
||||
```
|
||||
|
||||
**API设计亮点**:
|
||||
- 使用`@Valid`进行请求参数验证
|
||||
- 支持JWT令牌认证响应
|
||||
- 提供新旧两套密码重置API(向后兼容)
|
||||
- 完整的JavaDoc文档
|
||||
|
||||
### 2. FeedbackController - 反馈管理控制器
|
||||
|
||||
**位置**: `src/main/java/com/dne/ems/controller/FeedbackController.java`
|
||||
|
||||
**主要功能**:
|
||||
- 反馈提交(支持JSON和multipart格式)
|
||||
- 反馈查询(支持多条件过滤和分页)
|
||||
- 反馈统计数据获取
|
||||
- 反馈处理和状态更新
|
||||
|
||||
**权限控制**:
|
||||
```java
|
||||
@PreAuthorize("isAuthenticated()") // 提交反馈
|
||||
@PreAuthorize("hasAnyRole('ADMIN', 'SUPERVISOR', 'DECISION_MAKER')") // 查看详情
|
||||
@PreAuthorize("hasAnyRole('ADMIN', 'SUPERVISOR')") // 处理反馈
|
||||
```
|
||||
|
||||
**高级查询支持**:
|
||||
- 状态过滤:PENDING_REVIEW/PROCESSED/REJECTED
|
||||
- 污染类型:AIR/WATER/SOIL/NOISE
|
||||
- 严重程度:LOW/MEDIUM/HIGH/CRITICAL
|
||||
- 地理位置:城市/区县
|
||||
- 时间范围:开始日期至结束日期
|
||||
- 关键词模糊匹配
|
||||
|
||||
**文件上传支持**:
|
||||
```java
|
||||
@PostMapping(value = "/submit", consumes = {"multipart/form-data"})
|
||||
public ResponseEntity<Feedback> submitFeedback(
|
||||
@Valid @RequestPart("feedback") FeedbackSubmissionRequest request,
|
||||
@RequestPart(value = "files", required = false) MultipartFile[] files,
|
||||
@AuthenticationPrincipal CustomUserDetails userDetails)
|
||||
```
|
||||
|
||||
### 3. TaskManagementController - 任务管理控制器
|
||||
|
||||
**位置**: `src/main/java/com/dne/ems/controller/TaskManagementController.java`
|
||||
|
||||
**主要功能**:
|
||||
- 任务创建与分配
|
||||
- 任务状态管理(审核、批准、拒绝、取消)
|
||||
- 从反馈创建任务
|
||||
- 任务查询与过滤
|
||||
|
||||
**权限设计**:
|
||||
```java
|
||||
@PreAuthorize("hasRole('SUPERVISOR')") // 类级别权限
|
||||
@PreAuthorize("hasAnyAuthority('ADMIN', 'SUPERVISOR', 'DECISION_MAKER')") // 查询权限
|
||||
@PreAuthorize("hasRole('ADMIN')") // 批准/拒绝权限
|
||||
```
|
||||
|
||||
**任务生命周期管理**:
|
||||
1. 创建任务 (`POST /api/management/tasks`)
|
||||
2. 分配任务 (`POST /{taskId}/assign`)
|
||||
3. 审核任务 (`POST /{taskId}/review`)
|
||||
4. 批准任务 (`POST /{taskId}/approve`)
|
||||
5. 拒绝任务 (`POST /{taskId}/reject`)
|
||||
6. 取消任务 (`POST /{taskId}/cancel`)
|
||||
|
||||
**从反馈创建任务**:
|
||||
```java
|
||||
@PostMapping("/feedback/{feedbackId}/create-task")
|
||||
@PreAuthorize("hasRole('SUPERVISOR')")
|
||||
public ResponseEntity<TaskDetailDTO> createTaskFromFeedback(
|
||||
@PathVariable Long feedbackId,
|
||||
@RequestBody @Valid TaskFromFeedbackRequest request)
|
||||
```
|
||||
|
||||
### 4. PersonnelController - 人员管理控制器
|
||||
|
||||
**位置**: `src/main/java/com/dne/ems/controller/PersonnelController.java`
|
||||
|
||||
**主要功能**:
|
||||
- 用户账号CRUD操作
|
||||
- 用户角色管理
|
||||
- 用户信息查询与更新
|
||||
|
||||
**权限控制**:
|
||||
```java
|
||||
@PreAuthorize("hasRole('ADMIN')") // 类级别,仅管理员可访问
|
||||
@PreAuthorize("hasRole('ADMIN') or hasRole('GRID_WORKER')") // 查询权限扩展
|
||||
```
|
||||
|
||||
**用户管理功能**:
|
||||
- 创建用户:`POST /api/personnel/users`
|
||||
- 查询用户:`GET /api/personnel/users`(支持角色和姓名过滤)
|
||||
- 获取用户详情:`GET /api/personnel/users/{userId}`
|
||||
- 更新用户信息:`PUT /api/personnel/users/{userId}`
|
||||
- 更新用户角色:`PATCH /api/personnel/users/{userId}/role`
|
||||
- 删除用户:`DELETE /api/personnel/users/{userId}`
|
||||
|
||||
## 其他控制器
|
||||
|
||||
### 5. 其他重要控制器
|
||||
|
||||
根据目录结构,还包含以下控制器:
|
||||
|
||||
- **DashboardController**: 仪表板数据
|
||||
- **FileController**: 文件管理
|
||||
- **GridController**: 网格管理
|
||||
- **GridWorkerTaskController**: 网格员任务
|
||||
- **MapController**: 地图相关
|
||||
- **OperationLogController**: 操作日志
|
||||
- **PathfindingController**: 路径规划
|
||||
- **ProfileController**: 用户配置
|
||||
- **PublicController**: 公共接口
|
||||
- **SupervisorController**: 主管功能
|
||||
- **TaskAssignmentController**: 任务分配
|
||||
|
||||
## 设计模式与最佳实践
|
||||
|
||||
### 1. 统一的响应格式
|
||||
```java
|
||||
// 成功响应
|
||||
ResponseEntity.ok(data)
|
||||
ResponseEntity.status(HttpStatus.CREATED).body(data)
|
||||
|
||||
// 分页响应
|
||||
PageDTO<T> pageDTO = new PageDTO<>(
|
||||
page.getContent(),
|
||||
page.getTotalElements(),
|
||||
page.getTotalPages(),
|
||||
page.getNumber(),
|
||||
page.getSize()
|
||||
);
|
||||
```
|
||||
|
||||
### 2. 权限控制策略
|
||||
- **类级别权限**: 整个控制器的基础权限
|
||||
- **方法级别权限**: 特定操作的细粒度权限
|
||||
- **角色层次**: ADMIN > SUPERVISOR > DECISION_MAKER > GRID_WORKER > USER
|
||||
|
||||
### 3. 参数验证
|
||||
```java
|
||||
@Valid @RequestBody // 请求体验证
|
||||
@Valid @RequestPart // 文件上传验证
|
||||
@NotBlank @Email String email // 参数级验证
|
||||
```
|
||||
|
||||
### 4. API文档
|
||||
- 使用Swagger/OpenAPI注解
|
||||
- 详细的JavaDoc文档
|
||||
- 参数说明和示例
|
||||
|
||||
### 5. 异常处理
|
||||
- 全局异常处理器
|
||||
- 自定义业务异常
|
||||
- 统一错误响应格式
|
||||
|
||||
### 6. 日志记录
|
||||
```java
|
||||
@Slf4j // Lombok日志注解
|
||||
log.debug("Creating user with username: {}", request.getUsername());
|
||||
log.info("User created successfully with ID: {}", user.getId());
|
||||
log.error("Failed to create user: {}", e.getMessage(), e);
|
||||
```
|
||||
|
||||
## 控制器交互流程
|
||||
|
||||
### 典型的请求处理流程:
|
||||
1. **请求接收**: Controller接收HTTP请求
|
||||
2. **权限验证**: Spring Security进行权限检查
|
||||
3. **参数验证**: @Valid注解触发参数验证
|
||||
4. **业务处理**: 调用Service层处理业务逻辑
|
||||
5. **响应返回**: 返回标准化的ResponseEntity
|
||||
6. **异常处理**: 全局异常处理器处理异常情况
|
||||
7. **日志记录**: 记录操作日志和审计信息
|
||||
|
||||
这种设计确保了代码的可维护性、安全性和可扩展性,体现了现代Spring Boot应用的最佳实践。
|
||||
@@ -1,346 +0,0 @@
|
||||
# EMS后端开发指南与最佳实践
|
||||
|
||||
## 开发环境准备
|
||||
|
||||
### 必需软件
|
||||
1. **JDK 17**: Oracle JDK或OpenJDK
|
||||
2. **Maven 3.6+**: 依赖管理和构建工具
|
||||
3. **IDE**: IntelliJ IDEA或Eclipse(推荐IDEA)
|
||||
4. **Git**: 版本控制
|
||||
5. **Postman**: API测试工具
|
||||
|
||||
### IDE配置
|
||||
```xml
|
||||
<!-- Maven配置 -->
|
||||
<settings>
|
||||
<localRepository>D:/maven/repository</localRepository>
|
||||
<mirrors>
|
||||
<mirror>
|
||||
<id>aliyun</id>
|
||||
<url>https://maven.aliyun.com/repository/public</url>
|
||||
<mirrorOf>central</mirrorOf>
|
||||
</mirror>
|
||||
</mirrors>
|
||||
</settings>
|
||||
```
|
||||
|
||||
### 项目导入
|
||||
1. 克隆项目到本地
|
||||
2. 使用IDE导入Maven项目
|
||||
3. 等待依赖下载完成
|
||||
4. 配置JDK版本为17
|
||||
|
||||
## 开发流程
|
||||
|
||||
### 1. 功能开发流程
|
||||
```
|
||||
需求分析 → 设计API → 编写代码 → 单元测试 → 集成测试 → 代码审查 → 部署
|
||||
```
|
||||
|
||||
### 2. 代码提交规范
|
||||
```bash
|
||||
# 提交信息格式
|
||||
type(scope): description
|
||||
|
||||
# 类型说明
|
||||
feat: 新功能
|
||||
fix: 修复bug
|
||||
docs: 文档更新
|
||||
style: 代码格式调整
|
||||
refactor: 重构
|
||||
test: 测试相关
|
||||
chore: 构建过程或辅助工具的变动
|
||||
|
||||
# 示例
|
||||
feat(auth): 添加JWT token刷新功能
|
||||
fix(feedback): 修复反馈状态更新bug
|
||||
docs(api): 更新API文档
|
||||
```
|
||||
|
||||
### 3. 分支管理策略
|
||||
```
|
||||
main: 主分支,生产环境代码
|
||||
develop: 开发分支,集成最新功能
|
||||
feature/*: 功能分支
|
||||
hotfix/*: 紧急修复分支
|
||||
release/*: 发布分支
|
||||
```
|
||||
|
||||
## 编码最佳实践
|
||||
|
||||
### 1. Controller层开发
|
||||
```java
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/users")
|
||||
@Validated
|
||||
public class UserController {
|
||||
|
||||
@Autowired
|
||||
private UserService userService;
|
||||
|
||||
@GetMapping("/{id}")
|
||||
public ResponseEntity<UserDTO> getUser(@PathVariable Long id) {
|
||||
UserDTO user = userService.getUserById(id);
|
||||
return ResponseEntity.ok(user);
|
||||
}
|
||||
|
||||
@PostMapping
|
||||
public ResponseEntity<UserDTO> createUser(@Valid @RequestBody UserCreationRequest request) {
|
||||
UserDTO user = userService.createUser(request);
|
||||
return ResponseEntity.status(HttpStatus.CREATED).body(user);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Service层开发
|
||||
```java
|
||||
@Service
|
||||
@Transactional
|
||||
public class UserService {
|
||||
|
||||
@Autowired
|
||||
private UserRepository userRepository;
|
||||
|
||||
@Autowired
|
||||
private ApplicationEventPublisher eventPublisher;
|
||||
|
||||
public UserDTO createUser(UserCreationRequest request) {
|
||||
// 业务逻辑处理
|
||||
User user = User.builder()
|
||||
.username(request.getUsername())
|
||||
.email(request.getEmail())
|
||||
.build();
|
||||
|
||||
User savedUser = userRepository.save(user);
|
||||
|
||||
// 发布事件
|
||||
eventPublisher.publishEvent(new UserCreatedEvent(savedUser));
|
||||
|
||||
return UserMapper.toDTO(savedUser);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Repository层开发
|
||||
```java
|
||||
@Repository
|
||||
public class UserRepository extends JsonFileRepository<User> {
|
||||
|
||||
public UserRepository() {
|
||||
super("users.json", User.class);
|
||||
}
|
||||
|
||||
public Optional<User> findByEmail(String email) {
|
||||
return findAll().stream()
|
||||
.filter(user -> email.equals(user.getEmail()))
|
||||
.findFirst();
|
||||
}
|
||||
|
||||
public List<User> findByRole(Role role) {
|
||||
return findAll().stream()
|
||||
.filter(user -> role.equals(user.getRole()))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 测试开发指南
|
||||
|
||||
### 1. 单元测试
|
||||
```java
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class UserServiceTest {
|
||||
|
||||
@Mock
|
||||
private UserRepository userRepository;
|
||||
|
||||
@InjectMocks
|
||||
private UserService userService;
|
||||
|
||||
@Test
|
||||
void shouldCreateUserSuccessfully() {
|
||||
// Given
|
||||
UserCreationRequest request = new UserCreationRequest();
|
||||
request.setUsername("testuser");
|
||||
|
||||
User savedUser = User.builder().id(1L).username("testuser").build();
|
||||
when(userRepository.save(any(User.class))).thenReturn(savedUser);
|
||||
|
||||
// When
|
||||
UserDTO result = userService.createUser(request);
|
||||
|
||||
// Then
|
||||
assertThat(result.getUsername()).isEqualTo("testuser");
|
||||
verify(userRepository).save(any(User.class));
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 集成测试
|
||||
```java
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||
@TestPropertySource(properties = {
|
||||
"file.upload-dir=./test-uploads"
|
||||
})
|
||||
class UserControllerIntegrationTest {
|
||||
|
||||
@Autowired
|
||||
private TestRestTemplate restTemplate;
|
||||
|
||||
@Test
|
||||
void shouldCreateUserSuccessfully() {
|
||||
UserCreationRequest request = new UserCreationRequest();
|
||||
request.setUsername("testuser");
|
||||
|
||||
ResponseEntity<UserDTO> response = restTemplate.postForEntity(
|
||||
"/api/v1/users", request, UserDTO.class);
|
||||
|
||||
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.CREATED);
|
||||
assertThat(response.getBody().getUsername()).isEqualTo("testuser");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 调试技巧
|
||||
|
||||
### 1. 日志调试
|
||||
```java
|
||||
@Slf4j
|
||||
@Service
|
||||
public class UserService {
|
||||
|
||||
public UserDTO createUser(UserCreationRequest request) {
|
||||
log.debug("Creating user with username: {}", request.getUsername());
|
||||
|
||||
try {
|
||||
// 业务逻辑
|
||||
User user = processUser(request);
|
||||
log.info("User created successfully with ID: {}", user.getId());
|
||||
return UserMapper.toDTO(user);
|
||||
} catch (Exception e) {
|
||||
log.error("Failed to create user: {}", e.getMessage(), e);
|
||||
throw new UserCreationException("Failed to create user", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 断点调试
|
||||
- 在IDE中设置断点
|
||||
- 使用条件断点
|
||||
- 观察变量值变化
|
||||
- 使用表达式求值
|
||||
|
||||
### 3. 性能调试
|
||||
```java
|
||||
@Component
|
||||
@Aspect
|
||||
public class PerformanceAspect {
|
||||
|
||||
@Around("@annotation(Timed)")
|
||||
public Object measureExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
|
||||
long startTime = System.currentTimeMillis();
|
||||
Object result = joinPoint.proceed();
|
||||
long endTime = System.currentTimeMillis();
|
||||
|
||||
log.info("Method {} executed in {} ms",
|
||||
joinPoint.getSignature().getName(),
|
||||
endTime - startTime);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 常见问题解决
|
||||
|
||||
### 1. 依赖冲突
|
||||
```bash
|
||||
# 查看依赖树
|
||||
mvn dependency:tree
|
||||
|
||||
# 排除冲突依赖
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-logging</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
### 2. JSON文件锁定问题
|
||||
```java
|
||||
@Component
|
||||
public class FileOperationService {
|
||||
|
||||
private final Object fileLock = new Object();
|
||||
|
||||
public void writeToFile(String filename, Object data) {
|
||||
synchronized (fileLock) {
|
||||
// 文件操作
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 内存泄漏排查
|
||||
```bash
|
||||
# 启动时添加JVM参数
|
||||
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./dumps/ -jar app.jar
|
||||
|
||||
# 使用JProfiler或VisualVM分析
|
||||
```
|
||||
|
||||
## 部署指南
|
||||
|
||||
### 1. 打包部署
|
||||
```bash
|
||||
# 清理并打包
|
||||
mvn clean package -DskipTests
|
||||
|
||||
# 运行
|
||||
java -jar target/ems-backend-0.0.1-SNAPSHOT.jar
|
||||
```
|
||||
|
||||
### 2. 配置文件管理
|
||||
```bash
|
||||
# 外部配置文件
|
||||
java -jar app.jar --spring.config.location=classpath:/application.properties,./config/application-prod.properties
|
||||
```
|
||||
|
||||
### 3. 健康检查
|
||||
```bash
|
||||
# 检查应用状态
|
||||
curl http://localhost:8080/actuator/health
|
||||
|
||||
# 检查API文档
|
||||
curl http://localhost:8080/swagger-ui.html
|
||||
```
|
||||
|
||||
## 扩展开发
|
||||
|
||||
### 1. 添加新的API端点
|
||||
1. 创建DTO类
|
||||
2. 创建Controller方法
|
||||
3. 实现Service逻辑
|
||||
4. 添加Repository方法
|
||||
5. 编写测试用例
|
||||
6. 更新API文档
|
||||
|
||||
### 2. 集成新的外部服务
|
||||
1. 添加配置属性
|
||||
2. 创建客户端类
|
||||
3. 实现服务接口
|
||||
4. 添加异常处理
|
||||
5. 编写集成测试
|
||||
|
||||
### 3. 性能优化
|
||||
1. 添加缓存层
|
||||
2. 优化数据库查询
|
||||
3. 使用异步处理
|
||||
4. 实现分页查询
|
||||
5. 添加监控指标
|
||||
@@ -1,350 +0,0 @@
|
||||
# EMS后端系统技术亮点与创新处理
|
||||
|
||||
## 🏗️ 技术架构创新
|
||||
|
||||
### 1. **自定义JSON文件存储系统**
|
||||
- 创新的轻量级数据持久化方案
|
||||
- 无需传统数据库,降低部署复杂度
|
||||
- 基于Jackson的高效JSON序列化/反序列化
|
||||
- 适合中小型应用的快速原型开发
|
||||
|
||||
### 2. **现代Spring Boot 3.5.0架构**
|
||||
- 采用最新Spring Boot 3.5.0框架
|
||||
- 充分利用Java 17新特性
|
||||
- WebFlux响应式编程支持
|
||||
- 完整的Spring Security集成
|
||||
|
||||
### 3. **模块化分层架构**
|
||||
- 清晰的Controller-Service-Repository分层
|
||||
- 基于Spring的依赖注入和AOP
|
||||
- 高内聚低耦合的模块设计
|
||||
- 易于测试和维护的代码结构
|
||||
|
||||
## 🔐 安全设计亮点
|
||||
|
||||
### 3. **JWT认证体系**
|
||||
- 基于JJWT库的JWT令牌认证
|
||||
- 无状态会话管理
|
||||
- 支持令牌刷新和过期处理
|
||||
- 安全的密钥管理
|
||||
|
||||
### 4. **Spring Security集成**
|
||||
- 完整的Spring Security配置
|
||||
- 密码加密存储(BCrypt算法)
|
||||
- 登录失败次数限制机制
|
||||
- 基于注解的方法级安全控制
|
||||
|
||||
### 5. **邮箱验证系统**
|
||||
- 邮箱验证码自动生成和验证
|
||||
- 验证码有效期管理
|
||||
- 支持用户注册和密码重置场景
|
||||
|
||||
## 🎯 业务逻辑创新
|
||||
|
||||
### 5. **智能反馈审核系统**
|
||||
- 集成火山引擎AI接口进行反馈初步审核
|
||||
- 自动化内容合规性检测
|
||||
- AI审核失败的人工复审机制
|
||||
- 反馈状态智能流转管理
|
||||
|
||||
### 6. **网格化管理系统**
|
||||
- 网格工作人员位置验证
|
||||
- 基于网格的任务分配机制
|
||||
- 网格覆盖范围管理
|
||||
- 工作人员与网格的关联管理
|
||||
|
||||
### 7. **任务生命周期管理**
|
||||
- 完整的任务创建、分配、执行、完成流程
|
||||
- 任务状态实时跟踪
|
||||
- 任务优先级和截止时间管理
|
||||
- 任务执行效率统计
|
||||
|
||||
### 8. **多维度反馈系统**
|
||||
- 支持文字和文件上传的反馈提交
|
||||
- 反馈分类和状态管理
|
||||
- 反馈处理进度跟踪
|
||||
- 基于时间和状态的反馈过滤
|
||||
|
||||
## 🤖 AI集成创新
|
||||
|
||||
### 9. **火山引擎AI审核**
|
||||
- 集成火山引擎AI接口
|
||||
- 自动化反馈内容审核
|
||||
- 智能合规性检测
|
||||
- AI审核结果状态管理
|
||||
|
||||
### 10. **A*路径算法**
|
||||
- 实现A*寻路算法服务
|
||||
- 支持网格化路径规划
|
||||
- 优化任务执行路径
|
||||
- 提高工作效率
|
||||
|
||||
## 📊 数据处理亮点
|
||||
|
||||
### 11. **JSON文件存储管理**
|
||||
- 基于Jackson的高效JSON处理
|
||||
- 文件锁机制保证数据一致性
|
||||
- 支持复杂对象序列化/反序列化
|
||||
- 轻量级数据持久化方案
|
||||
|
||||
### 12. **文件上传管理**
|
||||
- 支持多种文件格式上传
|
||||
- 文件大小和类型验证
|
||||
- 安全的文件存储路径管理
|
||||
- 文件访问URL生成
|
||||
|
||||
## 🎨 用户体验创新
|
||||
|
||||
### 13. **RESTful API设计**
|
||||
- 标准化的REST API接口
|
||||
- 统一的响应格式和错误处理
|
||||
- 完整的Swagger API文档
|
||||
- 清晰的HTTP状态码使用
|
||||
|
||||
### 14. **邮件服务集成**
|
||||
- Spring Boot Mail集成
|
||||
- 支持HTML格式邮件发送
|
||||
- 验证码邮件自动发送
|
||||
- 邮件发送状态跟踪
|
||||
|
||||
## ⚡ 性能优化亮点
|
||||
|
||||
### 15. **异步处理支持**
|
||||
- WebFlux响应式编程
|
||||
- 非阻塞I/O操作
|
||||
- 异步邮件发送
|
||||
- 提升系统响应性能
|
||||
|
||||
### 16. **JSON处理优化**
|
||||
- Jackson高性能序列化
|
||||
- 自定义序列化配置
|
||||
- 大文件分块处理
|
||||
- 内存使用优化
|
||||
|
||||
- ### 14. **多级缓存策略**
|
||||
- 内存缓存热点数据
|
||||
- 分页查询优化
|
||||
- 懒加载机制
|
||||
- 数据预加载策略
|
||||
|
||||
### 15. **异步处理机制**
|
||||
- 文件上传异步处理
|
||||
- 邮件发送异步队列
|
||||
- 大数据量统计异步计算
|
||||
- 非阻塞式操作设计
|
||||
|
||||
## 🔧 开发体验优化
|
||||
|
||||
### 17. **完善的异常处理**
|
||||
- 全局异常处理器
|
||||
- 自定义异常类型
|
||||
- 详细的错误日志记录
|
||||
- 统一的错误响应格式
|
||||
|
||||
### 18. **现代化注解使用**
|
||||
- Spring Boot注解简化配置
|
||||
- 自定义验证注解(如@ValidPassword)
|
||||
- Lombok减少样板代码
|
||||
- 提高开发效率和代码可读性
|
||||
- ### 17. **全面的日志系统**
|
||||
- 操作日志自动记录
|
||||
- 分级日志管理
|
||||
- 性能监控日志
|
||||
- 安全审计日志
|
||||
|
||||
### 19. **代码组织结构**
|
||||
- 清晰的包结构划分
|
||||
- 统一的命名规范
|
||||
- 良好的代码注释
|
||||
- 易于维护和扩展
|
||||
- ### 18. **模块化设计**
|
||||
- 清晰的分层架构(Controller-Service-Repository)
|
||||
- 高内聚低耦合的模块设计
|
||||
- 易于扩展和维护
|
||||
- 支持微服务架构演进
|
||||
|
||||
## 🌟 部署和配置特性
|
||||
|
||||
### 20. **配置管理**
|
||||
- Spring Boot配置文件管理
|
||||
- 多环境配置支持
|
||||
- 外部化配置
|
||||
- 灵活的属性配置
|
||||
|
||||
### 21. **日志记录**
|
||||
- 操作日志自动记录
|
||||
- 用户行为追踪
|
||||
- 系统事件记录
|
||||
- 便于问题排查和审计
|
||||
|
||||
## 🎯 实际技术总结
|
||||
|
||||
### 22. **前端技术栈**
|
||||
- Vue.js 3.5.13前端框架
|
||||
- Element Plus UI组件库
|
||||
- TypeScript类型安全
|
||||
- Vite 6.2.4构建工具
|
||||
|
||||
### 23. **状态管理**
|
||||
- Pinia状态管理
|
||||
- Vue Router路由管理
|
||||
- Axios HTTP客户端
|
||||
- 组件化开发模式
|
||||
|
||||
### 24. **开发工具**
|
||||
- Maven项目管理
|
||||
- Spring Boot DevTools
|
||||
- Swagger API文档
|
||||
- 热重载开发支持
|
||||
|
||||
## 📋 技术特性总结
|
||||
|
||||
基于对EMS后端系统的实际代码分析,以上24个技术亮点真实反映了系统的核心特性:
|
||||
|
||||
### 🏗️ **核心架构**
|
||||
- Spring Boot 3.5.0 + Java 17现代技术栈
|
||||
- 自定义JSON文件存储系统
|
||||
- 模块化分层架构设计
|
||||
|
||||
### 🔐 **安全机制**
|
||||
- JWT认证体系
|
||||
- Spring Security集成
|
||||
- 邮箱验证系统
|
||||
|
||||
### 🎯 **业务功能**
|
||||
- 智能反馈审核(火山引擎AI)
|
||||
- 网格化管理系统
|
||||
- 任务生命周期管理
|
||||
- 多维度反馈系统
|
||||
|
||||
### 🤖 **AI集成**
|
||||
- 火山引擎AI审核
|
||||
- A*路径算法
|
||||
|
||||
### 📊 **数据处理**
|
||||
- JSON文件存储管理
|
||||
- 文件上传管理
|
||||
|
||||
### 🎨 **用户体验**
|
||||
- RESTful API设计
|
||||
- 邮件服务集成
|
||||
|
||||
### ⚡ **性能优化**
|
||||
- 异步处理支持
|
||||
- JSON处理优化
|
||||
|
||||
### 🔧 **开发体验**
|
||||
- 完善的异常处理
|
||||
- 现代化注解使用
|
||||
- 代码组织结构
|
||||
|
||||
### 🌟 **部署配置**
|
||||
- 配置管理
|
||||
- 日志记录
|
||||
|
||||
### 🎯 **前端集成**
|
||||
- Vue.js 3.5.13技术栈
|
||||
- 现代化开发工具链
|
||||
|
||||
---
|
||||
|
||||
## 🎯 EMS系统技术价值
|
||||
|
||||
### 创新性
|
||||
- **轻量级存储方案**:JSON文件存储避免了传统数据库的复杂性
|
||||
- **AI智能审核**:集成火山引擎AI技术提升内容审核效率
|
||||
- **网格化管理**:创新的地理网格管理模式
|
||||
|
||||
### 实用性
|
||||
- **快速部署**:Spring Boot单JAR包部署,降低运维成本
|
||||
- **高性能**:WebFlux异步处理提升系统响应速度
|
||||
- **易维护**:模块化设计和完善的API文档支持
|
||||
|
||||
### 技术特色
|
||||
- **现代化技术栈**:Spring Boot 3.5.0 + Java 17 + Vue.js 3.5.13
|
||||
- **安全可靠**:JWT认证 + Spring Security多层防护
|
||||
- **开发友好**:Swagger文档 + 热重载 + TypeScript类型安全
|
||||
|
||||
## 💡 创新亮点总结
|
||||
|
||||
EMS后端系统的50个创新亮点涵盖了以下核心领域:
|
||||
|
||||
### 🏗️ **架构设计** (10个亮点)
|
||||
- 自定义JSON存储、现代Spring Boot架构、事件驱动设计等
|
||||
|
||||
### 🔒 **安全防护** (8个亮点)
|
||||
- 多层安全防护、数据加密、API安全、合规保障等
|
||||
|
||||
### 💼 **业务创新** (12个亮点)
|
||||
- 智能任务管理、网格化管理、AI集成、业务智能化等
|
||||
|
||||
### ⚡ **性能优化** (8个亮点)
|
||||
- 缓存策略、异步处理、网络优化、性能监控等
|
||||
|
||||
### 🎨 **用户体验** (6个亮点)
|
||||
- 响应式设计、PWA支持、无障碍设计、国际化等
|
||||
|
||||
### 🔧 **开发运维** (6个亮点)
|
||||
- 自动化测试、CI/CD、监控观测、开发工具链等
|
||||
|
||||
## 🎯 技术价值体现
|
||||
|
||||
1. **创新性**:在环境监测领域引入了多项前沿技术
|
||||
2. **实用性**:解决了实际业务场景中的痛点问题
|
||||
3. **扩展性**:为未来发展预留了充足的技术空间
|
||||
4. **可维护性**:采用了业界最佳实践和设计模式
|
||||
5. **安全性**:建立了完善的安全防护体系
|
||||
6. **性能**:通过多种优化手段保证了系统高效运行
|
||||
|
||||
## 🌟 行业影响力
|
||||
|
||||
- **技术引领**:为环境监测管理系统树立了新的技术标杆
|
||||
- **模式创新**:探索了政府数字化转型的新路径
|
||||
- **生态建设**:推动了相关技术生态的发展和完善
|
||||
- **标准制定**:为行业标准化建设提供了重要参考
|
||||
|
||||
---
|
||||
|
||||
## 📚 实际技术栈清单
|
||||
|
||||
### 后端核心技术
|
||||
- **框架**: Spring Boot 3.5.0
|
||||
- **语言**: Java 17
|
||||
- **安全**: Spring Security + JJWT
|
||||
- **文档**: SpringDoc OpenAPI
|
||||
- **邮件**: Spring Boot Mail
|
||||
- **响应式**: Spring WebFlux
|
||||
- **WebSocket**: Spring WebSocket
|
||||
- **验证**: Spring Boot Validation
|
||||
- **工具**: Lombok, Jackson
|
||||
- **构建**: Maven
|
||||
- **存储**: 自定义JSON文件存储系统
|
||||
- **消息**: Spring Events + 异步处理
|
||||
### 开发运维工具
|
||||
- **版本控制**: Git + GitFlow
|
||||
- **API测试**: Postman + Newman
|
||||
|
||||
### 前端核心技术
|
||||
- **框架**: Vue.js 3.5.13
|
||||
- **构建**: Vite 6.2.4
|
||||
- **语言**: TypeScript
|
||||
- **UI**: Element Plus
|
||||
- **状态**: Pinia
|
||||
- **路由**: Vue Router
|
||||
- **HTTP**: Axios
|
||||
|
||||
### 数据与存储
|
||||
- **存储**: JSON文件系统
|
||||
- **文件**: 本地文件存储
|
||||
- **序列化**: Jackson
|
||||
|
||||
### 外部集成
|
||||
- **AI**: 火山引擎AI接口
|
||||
- **算法**: A*寻路算法
|
||||
- **邮件**: SMTP服务
|
||||
|
||||
---
|
||||
|
||||
*文档最后更新时间:2024年*
|
||||
*基于EMS后端系统深度代码分析和技术调研生成*
|
||||
*包含50个核心技术亮点和创新处理方案*
|
||||
@@ -1,185 +0,0 @@
|
||||
# EMS后端项目深度技术分析报告
|
||||
|
||||
## 🎯 项目激活状态
|
||||
✅ **项目已成功激活**: `ems-backend` 项目位于 `D:\Work\TTC\FY25\ems\emsfinally\ems-backend`
|
||||
|
||||
## 📋 项目整体结构概览
|
||||
|
||||
### 🏗️ 核心架构设计
|
||||
EMS (Environmental Monitoring System) 后端是一个基于 **Spring Boot 3.5.0** 的现代化环境监测管理系统,采用 **Java 17** 开发,具有以下特色:
|
||||
|
||||
- **无数据库设计**: 创新的JSON文件存储系统
|
||||
- **模块化分层架构**: Controller-Service-Repository标准分层
|
||||
- **事件驱动架构**: Spring Events解耦组件
|
||||
- **AI智能集成**: 火山引擎AI审核系统
|
||||
|
||||
### 📁 项目目录结构
|
||||
```
|
||||
src/main/java/com/dne/ems/
|
||||
├── 📂 config/ # 配置类 (7个文件)
|
||||
│ ├── OpenApiConfig.java # Swagger API文档配置
|
||||
│ ├── SecurityConfig.java # Spring Security安全配置
|
||||
│ ├── WebClientConfig.java # WebClient配置
|
||||
│ └── ...
|
||||
├── 📂 controller/ # REST控制器 (14个文件)
|
||||
│ ├── AuthController.java # 认证控制器
|
||||
│ ├── FeedbackController.java # 反馈管理
|
||||
│ ├── TaskManagementController.java # 任务管理
|
||||
│ ├── DashboardController.java # 仪表板
|
||||
│ └── ...
|
||||
├── 📂 dto/ # 数据传输对象 (50+个文件)
|
||||
│ ├── ai/ # AI相关DTO
|
||||
│ ├── LoginRequest.java
|
||||
│ ├── FeedbackDTO.java
|
||||
│ └── ...
|
||||
├── 📂 model/ # 数据模型 (20+个文件)
|
||||
│ ├── enums/ # 枚举类型
|
||||
│ ├── User.java
|
||||
│ ├── Feedback.java
|
||||
│ └── ...
|
||||
├── 📂 service/ # 业务逻辑层 (20+个文件)
|
||||
│ ├── AuthService.java
|
||||
│ ├── FeedbackService.java
|
||||
│ └── ...
|
||||
├── 📂 repository/ # 数据访问层
|
||||
├── 📂 security/ # 安全相关
|
||||
├── 📂 exception/ # 异常处理
|
||||
├── 📂 event/ # 事件定义
|
||||
├── 📂 listener/ # 事件监听器
|
||||
└── 📂 validation/ # 数据验证
|
||||
```
|
||||
|
||||
## 🔄 系统执行流程分析
|
||||
|
||||
### 1. **用户认证流程**
|
||||
```
|
||||
用户登录 → JWT Token生成 → Spring Security验证 → 角色权限检查 → 业务操作
|
||||
```
|
||||
|
||||
### 2. **反馈处理流程**
|
||||
```
|
||||
公众提交反馈 → AI智能审核 → 人工复审 → 任务创建 → 网格员分配 → 任务执行 → 结果反馈
|
||||
```
|
||||
|
||||
### 3. **任务管理流程**
|
||||
```
|
||||
CREATED → ASSIGNED → IN_PROGRESS → SUBMITTED → APPROVED/REJECTED
|
||||
```
|
||||
|
||||
### 4. **事件驱动流程**
|
||||
```
|
||||
业务操作 → 发布事件 → 异步监听器 → 后续处理 (邮件通知/日志记录/AI审核)
|
||||
```
|
||||
|
||||
## 🛠️ 深度技术分析
|
||||
|
||||
### 🏗️ **架构创新亮点**
|
||||
|
||||
#### 1. **自定义JSON存储系统**
|
||||
- **创新点**: 摒弃传统关系型数据库,采用JSON文件存储
|
||||
- **技术实现**: 基于Jackson的高效序列化/反序列化
|
||||
- **优势**: 部署简单、无需数据库维护、适合快速原型开发
|
||||
- **存储文件**: 9个核心JSON文件管理所有业务数据
|
||||
|
||||
#### 2. **现代Spring Boot 3.5.0架构**
|
||||
- **框架版本**: Spring Boot 3.5.0 + Java 17
|
||||
- **响应式支持**: Spring WebFlux异步处理
|
||||
- **安全集成**: Spring Security + JWT认证
|
||||
- **文档化**: SpringDoc OpenAPI自动生成API文档
|
||||
|
||||
### 🔐 **安全设计特色**
|
||||
|
||||
#### 1. **多层安全防护**
|
||||
- **JWT认证**: 无状态Token认证机制
|
||||
- **密码加密**: BCrypt算法安全存储
|
||||
- **登录保护**: 失败次数限制和账户锁定
|
||||
- **权限控制**: 基于角色的细粒度权限管理
|
||||
|
||||
#### 2. **角色权限体系**
|
||||
```
|
||||
ADMIN (系统管理员) → 全系统权限
|
||||
SUPERVISOR (主管) → 管理网格员,审核任务
|
||||
DECISION_MAKER (决策者) → 数据查看和分析
|
||||
GRID_WORKER (网格员) → 执行分配任务
|
||||
PUBLIC (公众) → 提交反馈
|
||||
```
|
||||
|
||||
### 🤖 **AI集成创新**
|
||||
|
||||
#### 1. **火山引擎AI审核**
|
||||
- **集成方式**: RESTful API调用
|
||||
- **应用场景**: 反馈内容智能审核
|
||||
- **处理流程**: 自动合规检测 → AI审核结果 → 人工复审机制
|
||||
- **技术价值**: 提升审核效率,减少人工工作量
|
||||
|
||||
#### 2. **A*路径规划算法**
|
||||
- **算法实现**: 自研A*寻路算法服务
|
||||
- **应用场景**: 网格化任务路径优化
|
||||
- **技术特色**: 支持复杂地理网格的最优路径计算
|
||||
|
||||
### 📊 **业务模块深度分析**
|
||||
|
||||
#### 1. **反馈管理系统**
|
||||
- **多格式支持**: JSON + Multipart文件上传
|
||||
- **智能分类**: 污染类型自动识别
|
||||
- **状态管理**: 7种反馈状态流转
|
||||
- **统计分析**: 多维度数据统计和趋势分析
|
||||
|
||||
#### 2. **任务管理系统**
|
||||
- **生命周期管理**: 完整的任务创建到完成流程
|
||||
- **智能分配**: 基于网格区域的自动分配算法
|
||||
- **实时跟踪**: 任务状态实时更新和进度监控
|
||||
- **绩效统计**: 任务完成率和效率分析
|
||||
|
||||
#### 3. **网格化管理**
|
||||
- **区域划分**: 灵活的网格区域定义
|
||||
- **人员分配**: 网格员与区域的智能匹配
|
||||
- **覆盖监控**: 网格覆盖率实时统计
|
||||
- **地图可视化**: 集成地图服务的可视化展示
|
||||
|
||||
### ⚡ **性能优化策略**
|
||||
|
||||
#### 1. **异步处理机制**
|
||||
- **Spring Async**: 异步任务执行
|
||||
- **事件驱动**: 非阻塞事件处理
|
||||
- **WebFlux**: 响应式编程提升并发性能
|
||||
- **线程池**: 自定义线程池配置优化
|
||||
|
||||
#### 2. **数据处理优化**
|
||||
- **分页查询**: 大数据量分页处理
|
||||
- **缓存策略**: 热点数据内存缓存
|
||||
- **JSON优化**: 高效的序列化/反序列化
|
||||
- **文件管理**: 智能文件存储和访问
|
||||
|
||||
## 🎯 **技术创新总结**
|
||||
|
||||
### 🌟 **核心创新点**
|
||||
1. **轻量级存储方案**: JSON文件存储替代传统数据库
|
||||
2. **AI智能审核**: 火山引擎AI集成提升业务效率
|
||||
3. **事件驱动架构**: Spring Events实现组件解耦
|
||||
4. **现代化技术栈**: Spring Boot 3.5.0 + Java 17
|
||||
5. **网格化管理**: 创新的地理网格管理模式
|
||||
|
||||
### 📈 **技术价值体现**
|
||||
- **部署简便**: 无需数据库,单JAR包部署
|
||||
- **开发效率**: 现代化框架和工具链
|
||||
- **扩展性强**: 模块化设计支持功能扩展
|
||||
- **性能优异**: 异步处理和响应式编程
|
||||
- **安全可靠**: 多层安全防护机制
|
||||
|
||||
### 🔮 **技术前瞻性**
|
||||
- **微服务就绪**: 分层架构支持微服务拆分
|
||||
- **云原生友好**: 容器化部署和配置外部化
|
||||
- **AI集成**: 为更多AI服务集成预留接口
|
||||
- **实时处理**: WebSocket支持实时数据推送
|
||||
|
||||
## 📊 **项目规模统计**
|
||||
- **控制器**: 14个REST控制器
|
||||
- **DTO类**: 50+个数据传输对象
|
||||
- **模型类**: 20+个业务模型
|
||||
- **服务类**: 20+个业务服务
|
||||
- **配置类**: 7个系统配置
|
||||
- **异常类**: 7个自定义异常
|
||||
- **事件类**: 多个业务事件定义
|
||||
|
||||
EMS后端系统展现了现代Java企业级应用的最佳实践,在技术创新、架构设计、业务实现等方面都具有很高的参考价值。
|
||||
@@ -1,163 +0,0 @@
|
||||
# EMS后端开发命令指南
|
||||
|
||||
## Maven构建命令
|
||||
|
||||
### 基础命令
|
||||
```bash
|
||||
# 清理项目
|
||||
mvn clean
|
||||
|
||||
# 编译项目
|
||||
mvn compile
|
||||
|
||||
# 运行测试
|
||||
mvn test
|
||||
|
||||
# 打包项目
|
||||
mvn package
|
||||
|
||||
# 安装到本地仓库
|
||||
mvn install
|
||||
|
||||
# 跳过测试打包
|
||||
mvn package -DskipTests
|
||||
```
|
||||
|
||||
### 运行应用
|
||||
```bash
|
||||
# 使用Maven运行
|
||||
mvn spring-boot:run
|
||||
|
||||
# 使用Java运行打包后的jar
|
||||
java -jar target/ems-backend-0.0.1-SNAPSHOT.jar
|
||||
|
||||
# 指定配置文件运行
|
||||
java -jar target/ems-backend-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
|
||||
```
|
||||
|
||||
## 开发工具命令
|
||||
|
||||
### 代码质量检查
|
||||
```bash
|
||||
# Maven编译检查
|
||||
mvn compile
|
||||
|
||||
# 运行所有测试
|
||||
mvn test
|
||||
|
||||
# 生成测试报告
|
||||
mvn surefire-report:report
|
||||
```
|
||||
|
||||
### 依赖管理
|
||||
```bash
|
||||
# 查看依赖树
|
||||
mvn dependency:tree
|
||||
|
||||
# 分析依赖
|
||||
mvn dependency:analyze
|
||||
|
||||
# 更新依赖版本
|
||||
mvn versions:display-dependency-updates
|
||||
```
|
||||
|
||||
## Windows系统工具命令
|
||||
|
||||
### 文件操作
|
||||
```cmd
|
||||
# 查看目录内容
|
||||
dir
|
||||
|
||||
# 递归查看目录
|
||||
dir /s
|
||||
|
||||
# 创建目录
|
||||
mkdir directory_name
|
||||
|
||||
# 删除文件
|
||||
del filename
|
||||
|
||||
# 删除目录
|
||||
rmdir /s directory_name
|
||||
```
|
||||
|
||||
### 进程管理
|
||||
```cmd
|
||||
# 查看运行的Java进程
|
||||
tasklist | findstr java
|
||||
|
||||
# 杀死进程
|
||||
taskkill /PID process_id /F
|
||||
|
||||
# 查看端口占用
|
||||
netstat -ano | findstr :8080
|
||||
```
|
||||
|
||||
### 文本搜索
|
||||
```cmd
|
||||
# 在文件中搜索文本
|
||||
findstr "search_text" filename
|
||||
|
||||
# 递归搜索
|
||||
findstr /s "search_text" *.java
|
||||
|
||||
# 搜索多个文件类型
|
||||
findstr /s "search_text" *.java *.properties
|
||||
```
|
||||
|
||||
## Git命令
|
||||
```bash
|
||||
# 查看状态
|
||||
git status
|
||||
|
||||
# 添加文件
|
||||
git add .
|
||||
|
||||
# 提交更改
|
||||
git commit -m "commit message"
|
||||
|
||||
# 推送到远程
|
||||
git push origin main
|
||||
|
||||
# 拉取最新代码
|
||||
git pull origin main
|
||||
|
||||
# 查看分支
|
||||
git branch
|
||||
|
||||
# 创建并切换分支
|
||||
git checkout -b feature/new-feature
|
||||
```
|
||||
|
||||
## 应用配置
|
||||
|
||||
### 默认端口
|
||||
- 后端服务: `http://localhost:8080`
|
||||
- Swagger UI: `http://localhost:8080/swagger-ui.html`
|
||||
|
||||
### 重要配置文件
|
||||
- `src/main/resources/application.properties` - 主配置文件
|
||||
- `pom.xml` - Maven依赖配置
|
||||
- `json-db/` - JSON数据文件目录
|
||||
- `uploads/` - 文件上传目录
|
||||
|
||||
## 调试和监控
|
||||
|
||||
### 日志查看
|
||||
```bash
|
||||
# 实时查看日志(如果有日志文件)
|
||||
tail -f logs/application.log
|
||||
|
||||
# Windows下查看日志
|
||||
type logs\application.log
|
||||
```
|
||||
|
||||
### 健康检查
|
||||
- 应用状态: `GET http://localhost:8080/actuator/health`
|
||||
- API文档: `http://localhost:8080/swagger-ui.html`
|
||||
|
||||
## 环境要求
|
||||
- Java 17+
|
||||
- Maven 3.6+
|
||||
- Windows 10/11
|
||||
- 8GB+ RAM推荐
|
||||
@@ -1,68 +0,0 @@
|
||||
# language of the project (csharp, python, rust, java, typescript, go, cpp, or ruby)
|
||||
# * For C, use cpp
|
||||
# * For JavaScript, use typescript
|
||||
# Special requirements:
|
||||
# * csharp: Requires the presence of a .sln file in the project folder.
|
||||
language: java
|
||||
|
||||
# whether to use the project's gitignore file to ignore files
|
||||
# Added on 2025-04-07
|
||||
ignore_all_files_in_gitignore: true
|
||||
# list of additional paths to ignore
|
||||
# same syntax as gitignore, so you can use * and **
|
||||
# Was previously called `ignored_dirs`, please update your config if you are using that.
|
||||
# Added (renamed)on 2025-04-07
|
||||
ignored_paths: []
|
||||
|
||||
# whether the project is in read-only mode
|
||||
# If set to true, all editing tools will be disabled and attempts to use them will result in an error
|
||||
# Added on 2025-04-18
|
||||
read_only: false
|
||||
|
||||
|
||||
# list of tool names to exclude. We recommend not excluding any tools, see the readme for more details.
|
||||
# Below is the complete list of tools for convenience.
|
||||
# To make sure you have the latest list of tools, and to view their descriptions,
|
||||
# execute `uv run scripts/print_tool_overview.py`.
|
||||
#
|
||||
# * `activate_project`: Activates a project by name.
|
||||
# * `check_onboarding_performed`: Checks whether project onboarding was already performed.
|
||||
# * `create_text_file`: Creates/overwrites a file in the project directory.
|
||||
# * `delete_lines`: Deletes a range of lines within a file.
|
||||
# * `delete_memory`: Deletes a memory from Serena's project-specific memory store.
|
||||
# * `execute_shell_command`: Executes a shell command.
|
||||
# * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced.
|
||||
# * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type).
|
||||
# * `find_symbol`: Performs a global (or local) search for symbols with/containing a given name/substring (optionally filtered by type).
|
||||
# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes.
|
||||
# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file or directory.
|
||||
# * `initial_instructions`: Gets the initial instructions for the current project.
|
||||
# Should only be used in settings where the system prompt cannot be set,
|
||||
# e.g. in clients you have no control over, like Claude Desktop.
|
||||
# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol.
|
||||
# * `insert_at_line`: Inserts content at a given line in a file.
|
||||
# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol.
|
||||
# * `list_dir`: Lists files and directories in the given directory (optionally with recursion).
|
||||
# * `list_memories`: Lists memories in Serena's project-specific memory store.
|
||||
# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building).
|
||||
# * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context).
|
||||
# * `read_file`: Reads a file within the project directory.
|
||||
# * `read_memory`: Reads the memory with the given name from Serena's project-specific memory store.
|
||||
# * `remove_project`: Removes a project from the Serena configuration.
|
||||
# * `replace_lines`: Replaces a range of lines within a file with new content.
|
||||
# * `replace_symbol_body`: Replaces the full definition of a symbol.
|
||||
# * `restart_language_server`: Restarts the language server, may be necessary when edits not through Serena happen.
|
||||
# * `search_for_pattern`: Performs a search for a pattern in the project.
|
||||
# * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase.
|
||||
# * `switch_modes`: Activates modes by providing a list of their names
|
||||
# * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information.
|
||||
# * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task.
|
||||
# * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed.
|
||||
# * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store.
|
||||
excluded_tools: []
|
||||
|
||||
# initial prompt for the project. It will always be given to the LLM upon activating the project
|
||||
# (contrary to the memories, which are loaded on demand).
|
||||
initial_prompt: ""
|
||||
|
||||
project_name: "ems-backend"
|
||||
@@ -1,521 +0,0 @@
|
||||
# Spring Boot 项目深度解析
|
||||
|
||||
本文档旨在深入解析当前 Spring Boot 项目的构建原理、核心技术以及业务逻辑,帮助您更好地理解和准备答疑。
|
||||
|
||||
## 一、Spring Boot 核心原理
|
||||
|
||||
Spring Boot 是一个用于简化新 Spring 应用的初始搭建以及开发过程的框架。其核心原理主要体现在以下几个方面:
|
||||
|
||||
### 1. 自动配置 (Auto-Configuration) - 智能的“管家”
|
||||
|
||||
您可以将 Spring Boot 的自动配置想象成一个非常智能的“管家”。在传统的 Spring 开发中,您需要手动配置很多东西,比如数据库连接、We你b 服务器等,就像您需要亲自告诉管家每一个细节:如何烧水、如何扫地。
|
||||
|
||||
而 Spring Boot 的“管家”则会观察您家里添置了什么新东西(即您在项目中加入了什么依赖),然后自动地把这些东西配置好,让它们能正常工作。
|
||||
|
||||
**它是如何工作的?**
|
||||
|
||||
1. **观察您的“购物清单” (`pom.xml`)**:当您在项目的 `pom.xml` 文件中加入一个 `spring-boot-starter-*` 依赖,比如 `spring-boot-starter-web`,就等于告诉“管家”:“我需要开发一个网站。”
|
||||
|
||||
2. **自动准备所需工具**:看到这个“购物清单”后,“管家”会立刻为您准备好一套完整的网站开发工具:
|
||||
* 一个嵌入式的 **Tomcat 服务器**,这样您就不用自己安装和配置服务器了。
|
||||
* 配置好 **Spring MVC** 框架,这是处理网页请求的核心工具。
|
||||
* 设置好处理 JSON 数据的工具 (Jackson),方便前后端通信。
|
||||
|
||||
3. **背后的魔法 (`@EnableAutoConfiguration`)**:这一切的起点是您项目主启动类上的 `@SpringBootApplication` 注解,它内部包含了 `@EnableAutoConfiguration`。这个注解就是给“管家”下达“开始自动工作”命令的开关。它会去检查一个固定的清单(位于 `META-INF/spring.factories`),上面写着所有它认识的工具(自动配置类)以及何时应该启用它们。
|
||||
|
||||
**项目实例:**
|
||||
|
||||
在本项目中,因为 `pom.xml` 包含了 `spring-boot-starter-web`,所以 Spring Boot 自动为您配置了处理 Web 请求的所有环境。这就是为什么您可以在 `com.dne.ems.controller` 包下的任何一个 Controller(例如 `AuthController`)中直接使用 `@RestController` 和 `@PostMapping` 这样的注解来定义 API 接口,而无需编写任何一行 XML 配置来启动 Web 服务或配置 Spring MVC。
|
||||
|
||||
简单来说,**自动配置就是 Spring Boot 替您完成了大部分繁琐、重复的配置工作,让您可以专注于编写业务代码。**
|
||||
|
||||
### 2. 起步依赖 (Starter Dependencies) - “主题工具箱”
|
||||
|
||||
如果说自动配置是“智能管家”,那么起步依赖就是“管家”使用的“主题工具箱”。您不需要告诉管家需要买钉子、锤子、螺丝刀……您只需要说:“我需要一个木工工具箱。”
|
||||
|
||||
起步依赖 (`spring-boot-starter-*`) 就是这样的“主题工具箱”。每一个 starter 都包含了一整套用于某个特定任务的、经过测试、版本兼容的依赖。
|
||||
|
||||
**项目实例:**
|
||||
|
||||
- **`spring-boot-starter-web`**: 这是“Web 开发工具箱”。它不仅包含了 Spring MVC,还包含了内嵌的 Tomcat 服务器和处理验证的库。您只需要引入这一个依赖,所有 Web 开发的基础环境就都准备好了。
|
||||
|
||||
- **`spring-boot-starter-data-jpa`**: 这是“数据库操作工具箱”。它打包了与数据库交互所需的一切,包括 Spring Data JPA、Hibernate (JPA 的一种实现) 和数据库连接池 (HikariCP)。您引入它之后,就可以直接在 `com.dne.ems.repository` 包下编写 `JpaRepository` 接口来进行数据库操作,而无需关心如何配置 Hibernate 或事务管理器。
|
||||
|
||||
- **`spring-boot-starter-security`**: 这是“安全管理工具箱”。引入它之后,Spring Security 框架就被集成进来,提供了认证和授权的基础功能。您可以在 `com.dne.ems.security.SecurityConfig` 中看到对这个“工具箱”的具体配置,比如定义哪些 API 需要登录才能访问。
|
||||
|
||||
**优势总结:**
|
||||
|
||||
- **简化依赖**:您不必再手动添加一长串的单个依赖项。
|
||||
- **避免冲突**:Spring Boot 已经为您管理好了这些依赖之间的版本,您不必再担心因为版本不兼容而导致的各种奇怪错误。
|
||||
|
||||
通过使用这些“工具箱”,您可以非常快速地搭建起一个功能完备的应用程序框架。
|
||||
|
||||
### 3. 嵌入式 Web 服务器
|
||||
|
||||
Spring Boot 内嵌了常见的 Web 服务器,如 Tomcat、Jetty 或 Undertow。这意味着您不需要将应用程序打包成 WAR 文件部署到外部服务器,而是可以直接将应用程序打包成一个可执行的 JAR 文件,通过 `java -jar` 命令来运行。
|
||||
|
||||
- **优势**:简化了部署流程,便于持续集成和持续部署 (CI/CD)。
|
||||
|
||||
## 二、前后端分离与交互原理
|
||||
|
||||
本项目采用前后端分离的架构,前端(如 Vue.js)和后端(Spring Boot)是两个独立的项目,它们之间通过 API 进行通信。
|
||||
|
||||
### 1. RESTful API
|
||||
|
||||
后端通过暴露一组 RESTful API 来提供服务。REST (Representational State Transfer) 是一种软件架构风格,它定义了一组用于创建 Web 服务的约束。核心思想是,将应用中的所有事物都看作资源,每个资源都有一个唯一的标识符 (URI)。
|
||||
|
||||
- **HTTP 方法**:
|
||||
- `GET`:获取资源。
|
||||
- `POST`:创建新资源。
|
||||
- `PUT` / `PATCH`:更新资源。
|
||||
- `DELETE`:删除资源。
|
||||
|
||||
### 2. JSON (JavaScript Object Notation)
|
||||
|
||||
前后端之间的数据交换格式通常是 JSON。当浏览器向后端发送请求时,它可能会在请求体中包含 JSON 数据。当后端响应时,它会将 Java 对象序列化为 JSON 字符串返回给前端。
|
||||
|
||||
- **Spring Boot 中的实现**:Spring Boot 默认使用 Jackson 库来处理 JSON 的序列化和反序列化。当 Controller 的方法参数有 `@RequestBody` 注解时,Spring 会自动将请求体中的 JSON 转换为 Java 对象。当方法有 `@ResponseBody` 或类有 `@RestController` 注解时,Spring 会自动将返回的 Java 对象转换为 JSON。
|
||||
|
||||
### 3. 认证与授权 (JWT)
|
||||
|
||||
在前后端分离架构中,常用的认证机制是 JSON Web Token (JWT)。
|
||||
|
||||
- **流程**:
|
||||
1. 用户使用用户名和密码登录。
|
||||
2. 后端验证凭据,如果成功,则生成一个 JWT 并返回给前端。
|
||||
3. 前端将收到的 JWT 存储起来(例如,在 `localStorage` 或 `sessionStorage` 中)。
|
||||
4. 在后续的每个请求中,前端都会在 HTTP 请求的 `Authorization` 头中携带这个 JWT。
|
||||
5. 后端的安全过滤器会拦截每个请求,验证 JWT 的有效性。如果验证通过,则允许访问受保护的资源。
|
||||
|
||||
## 三、项目业务逻辑与分层结构分析
|
||||
|
||||
本项目是一个环境管理系统 (EMS),其代码结构遵循经典的分层架构模式。
|
||||
|
||||
### 1. 分层结构概述
|
||||
|
||||
```
|
||||
+----------------------------------------------------+
|
||||
| Controller (表现层) |
|
||||
| (处理 HTTP 请求, 调用 Service, 返回 JSON 响应) |
|
||||
+----------------------+-----------------------------+
|
||||
| (调用)
|
||||
+----------------------v-----------------------------+
|
||||
| Service (业务逻辑层) |
|
||||
| (实现核心业务逻辑, 事务管理) |
|
||||
+----------------------+-----------------------------+
|
||||
| (调用)
|
||||
+----------------------v-----------------------------+
|
||||
| Repository (数据访问层) |
|
||||
| (通过 Spring Data JPA 与数据库交互) |
|
||||
+----------------------+-----------------------------+
|
||||
| (操作)
|
||||
+----------------------v-----------------------------+
|
||||
| Model (领域模型) |
|
||||
| (定义数据结构, 对应数据库表) |
|
||||
+----------------------------------------------------+
|
||||
```
|
||||
|
||||
### 2. 各层详细分析
|
||||
|
||||
#### a. Model (领域模型)
|
||||
|
||||
位于 `com.dne.ems.model` 包下,是应用程序的核心。这些是简单的 Java 对象 (POJO),使用 JPA 注解(如 `@Entity`, `@Table`, `@Id`, `@Column`)映射到数据库中的表。
|
||||
|
||||
- **核心实体**:
|
||||
- `UserAccount`: 用户账户信息,包含角色、状态等。
|
||||
- `Task`: 任务实体,包含任务状态、描述、位置等信息。
|
||||
- `Feedback`: 公众或用户提交的反馈信息。
|
||||
- `Grid`: 地理网格信息,用于管理和分配任务区域。
|
||||
- `Attachment`: 附件信息,如上传的图片。
|
||||
|
||||
#### b. Repository (数据访问层)
|
||||
|
||||
位于 `com.dne.ems.repository` 包下。这些是接口,继承自 Spring Data JPA 的 `JpaRepository`。开发者只需要定义接口,Spring Data JPA 会在运行时自动为其提供实现,从而极大地简化了数据访问代码。
|
||||
|
||||
- **示例**:`TaskRepository` 提供了对 `Task` 实体的 CRUD (创建、读取、更新、删除) 操作,以及基于方法名约定的查询功能(如 `findByStatus(TaskStatus status)`)。
|
||||
|
||||
#### c. Service (业务逻辑层)
|
||||
|
||||
位于 `com.dne.ems.service` 包下,是业务逻辑的核心实现。Service 层封装了应用程序的业务规则和流程,并负责协调多个 Repository 来完成一个完整的业务操作。事务管理也通常在这一层通过 `@Transactional` 注解来声明。
|
||||
|
||||
- **主要 Service 及其职责**:
|
||||
- `AuthService`: 处理用户认证,如登录、注册。
|
||||
- `TaskManagementService`: 负责任务的创建、更新、查询等核心管理功能。
|
||||
- `TaskAssignmentService`: 负责任务的分配逻辑,如自动分配或手动指派。
|
||||
- `SupervisorService`: 主管相关的业务逻辑,如审核任务。
|
||||
- `GridWorkerTaskService`: 网格员的任务处理逻辑,如提交任务进度。
|
||||
- `FeedbackService`: 处理公众反馈,可能包括创建任务等后续操作。
|
||||
- `PersonnelService`: 员工管理,如添加、查询用户信息。
|
||||
|
||||
- **层间关系**:Service 通常会注入 (DI) 一个或多个 Repository 来操作数据。一个 Service 也可能调用另一个 Service 来复用业务逻辑。
|
||||
|
||||
#### d. Controller (表现层)
|
||||
|
||||
位于 `com.dne.ems.controller` 包下。Controller 负责接收来自客户端的 HTTP 请求,解析请求参数,然后调用相应的 Service 来处理业务逻辑。最后,它将 Service 返回的数据(通常是 DTO)封装成 HTTP 响应(通常是 JSON 格式)返回给客户端。
|
||||
|
||||
- **主要 Controller 及其职责**:
|
||||
- `AuthController`: 暴露 `/api/auth/login`, `/api/auth/register` 等认证相关的端点。
|
||||
- `TaskManagementController`: 提供任务管理的 RESTful API,如 `GET /api/tasks`, `POST /api/tasks`。
|
||||
- `SupervisorController`: 提供主管操作的 API,如审核、分配任务。
|
||||
- `FileController`: 处理文件上传和下载。
|
||||
|
||||
- **DTO (Data Transfer Object)**:位于 `com.dne.ems.dto` 包下。Controller 和 Service 之间,以及 Controller 和前端之间,通常使用 DTO 来传输数据。这样做的好处是可以避免直接暴露数据库实体,并且可以根据前端页面的需要来定制数据结构,避免传输不必要的信息。
|
||||
|
||||
### 3. 安全 (Security)
|
||||
|
||||
位于 `com.dne.ems.security` 包下。使用 Spring Security 来提供全面的安全服务。
|
||||
|
||||
- `SecurityConfig`: 配置安全规则,如哪些 URL 是公开的,哪些需要认证,以及配置 JWT 过滤器。
|
||||
- `JwtAuthenticationFilter`: 一个自定义的过滤器,在每个请求到达 Controller 之前执行。它从请求头中提取 JWT,验证其有效性,并将用户信息加载到 Spring Security 的上下文中。
|
||||
- `UserDetailsServiceImpl`: 实现了 Spring Security 的 `UserDetailsService` 接口,负责根据用户名从数据库加载用户信息(包括密码和权限)。
|
||||
|
||||
## 四、总结
|
||||
|
||||
这个 Spring Boot 项目是一个典型的、结构清晰的、基于 RESTful API 的前后端分离应用。它有效地利用了 Spring Boot 的自动配置和起步依赖来简化开发,并通过分层架构将表现、业务逻辑和数据访问清晰地分离开来,使得项目易于理解、维护和扩展。
|
||||
|
||||
希望这份文档能帮助您在答疑中充满信心!
|
||||
|
||||
## 五、为小白定制:项目代码结构与工作流程详解
|
||||
|
||||
为了让您彻底理解代码是如何组织的,我们把整个后端项目想象成一个分工明确的大公司。
|
||||
|
||||
### 1. 公司各部门职责 (包/文件夹的作用)
|
||||
|
||||
- **`com.dne.ems.config` (后勤与配置部)**
|
||||
- **职责**: 负责应用的各种基础配置。比如 `WebClientConfig` 是配置网络请求工具的,`WebSocketConfig` 是配置实时通讯的,`DataInitializer` 则是在项目启动时初始化一些默认数据(比如默认的管理员账号)。这个部门确保了其他所有部门的工具和环境都是准备好的。
|
||||
|
||||
- **`com.dne.ems.model` (产品设计部)**
|
||||
- **职责**: 定义公司的核心“产品”是什么样的。这里的“产品”就是数据。例如,`UserAccount.java` 定义了“用户”有哪些属性(姓名、密码、角色等),`Task.java` 定义了“任务”有哪些属性(标题、状态、截止日期等)。它们是整个公司的业务基础,决定了公司要处理什么信息。这些文件直接对应数据库里的表结构。
|
||||
|
||||
- **`com.dne.ems.repository` (仓库管理部)**
|
||||
- **职责**: 专门负责和数据库这个大“仓库”打交道。当需要存取数据时,其他部门不会直接去仓库,而是会通知仓库管理员。例如,`TaskRepository` 提供了所有操作 `Task` 表的方法,如保存一个新任务、根据ID查找一个任务。这个部门使用了 Spring Data JPA 技术,所以代码看起来很简单,但功能强大。
|
||||
|
||||
- **`com.dne.ems.service` (核心业务部)**
|
||||
- **职责**: 这是公司的核心部门,负责处理所有实际的业务逻辑。一个业务操作可能很复杂,需要协调多个部门。例如,`TaskManagementService` (任务管理服务) 在创建一个新任务时,可能需要:
|
||||
1. 调用 `TaskRepository` 将任务信息存入数据库。
|
||||
2. 调用 `UserAccountRepository` 查找合适的执行人。
|
||||
3. 调用 `NotificationService` (如果存在的话) 发送通知。
|
||||
- **`impl` 子目录**: `service` 包下通常是接口 (定义了“能做什么”),而 `impl` (implementation) 包下是这些接口的具体实现 (定义了“具体怎么做”)。这是为了“面向接口编程”,是一种良好的编程习惯。
|
||||
|
||||
- **`com.dne.ems.controller` (客户服务与接待部)**
|
||||
- **职责**: 这是公司的“前台”,直接面向客户(在这里就是前端浏览器或App)。它接收客户的请求(HTTP 请求),然后将请求传达给相应的业务部门 (`Service`) 去处理。处理完成后,它再把结果(通常是 JSON 格式的数据)返回给客户。
|
||||
- 例如,`TaskManagementController` 里的一个 `createTask` 方法,会接收前端发来的创建任务的请求,然后调用 `TaskManagementService` 的 `createTask` 方法来真正执行创建逻辑。
|
||||
|
||||
- **`com.dne.ems.dto` (数据包装与运输部)**
|
||||
- **职责**: 负责数据的包装和运输。直接把数据库里的原始数据 (`Model`) 给客户看是不安全也不专业的。DTO (Data Transfer Object) 就是专门用于在各部门之间,特别是“前台”(`Controller`)和客户(前端)之间传递数据的“包装盒”。
|
||||
- 例如,`TaskDTO` 可能只包含任务的ID、标题和状态,而隐藏了创建时间、更新时间等前端不需要的敏感信息。
|
||||
|
||||
- **`com.dne.ems.security` (安保部)**
|
||||
- **职责**: 负责整个公司的安全。`SecurityConfig` 定义了公司的安保规则(比如哪些地方需要门禁卡才能进),`JwtAuthenticationFilter` 就是门口的保安,每个请求进来都要检查它的“门禁卡”(JWT Token) 是否有效。
|
||||
|
||||
- **`com.dne.ems.exception` (风险与危机处理部)**
|
||||
- **职责**: 处理各种突发异常情况。当业务流程中出现错误时(比如找不到用户、数据库连接失败),`GlobalExceptionHandler` 会捕获这些错误,并给出一个统一、友好的错误提示给前端,而不是让程序崩溃。
|
||||
|
||||
### 2. 一次典型的请求流程:用户登录
|
||||
|
||||
让我们通过“用户登录”这个简单的例子,看看这些部门是如何协同工作的:
|
||||
|
||||
1. **客户上门 (前端 -> Controller)**: 用户在前端页面输入用户名和密码,点击登录。前端将这些信息打包成一个 JSON 对象,发送一个 HTTP POST 请求到后端的 `/api/auth/login` 地址。
|
||||
|
||||
2. **前台接待 (Controller)**: `AuthController` 接收到这个请求。它看到地址是 `/login`,于是调用 `login` 方法。它从请求中取出 JSON 数据,并将其转换为 `LoginRequest` 这个 DTO 对象。
|
||||
|
||||
3. **转交业务部门 (Controller -> Service)**: `AuthController` 自己不处理登录逻辑,它调用 `AuthService` 的 `login` 方法,并将 `LoginRequest` 这个 DTO 传递过去。
|
||||
|
||||
4. **核心业务处理 (Service)**: `AuthService` 开始处理登录:
|
||||
a. 它首先需要验证用户名是否存在,于是它请求 **仓库管理部** (`UserAccountRepository`):“请帮我根据这个用户名 (`loginRequest.getUsername()`) 查一下有没有这个人。”
|
||||
b. `UserAccountRepository` 从数据库中查找到对应的 `UserAccount` (Model) 信息,返回给 `AuthService`。
|
||||
c. `AuthService` 拿到用户信息后,会使用密码加密工具,验证用户提交的密码和数据库中存储的加密密码是否匹配。
|
||||
d. 如果验证成功,`AuthService` 会请求 **安保部** (`JwtService`):“请为这位用户生成一张有时效的门禁卡 (JWT Token)。”
|
||||
|
||||
5. **返回处理结果 (Service -> Controller -> 前端)**: `JwtService` 生成 Token 后返回给 `AuthService`。`AuthService` 将 Token 包装在一个 `JwtAuthenticationResponse` DTO 中,返回给 `AuthController`。`AuthController` 再将这个包含 Token 的 DTO 转换成 JSON 格式,作为 HTTP 响应返回给前端。
|
||||
|
||||
6. **客户拿到凭证 (前端)**: 前端收到包含 Token 的响应,就知道登录成功了。它会把这个 Token 保存起来,在之后访问需要权限的页面时,都会带上这张“门禁卡”。
|
||||
|
||||
通过这个流程,您可以看到,一个简单的请求背后是多个“部门”按照明确的职责划分,层层调用、协同工作的结果。这种结构使得代码逻辑清晰,易于维护和扩展。
|
||||
嗯
|
||||
## 六、核心业务流程与关键机制分析
|
||||
|
||||
下面,我们将梳理出本项目的几个核心业务流程和支撑这些流程的关键技术机制,并详细说明它们涉及的层级和文件,让您清晰地看到数据和指令是如何在系统中流转的。
|
||||
|
||||
### (一) 核心业务流程
|
||||
|
||||
#### 流程一:用户认证与授权 (Authentication & Authorization)
|
||||
|
||||
**目标**:保障系统安全,确保只有授权用户才能访问受保护的资源。
|
||||
|
||||
**执行路径**:
|
||||
|
||||
1. **注册 (`signup`)**
|
||||
* **入口**: `AuthController.signup()`
|
||||
* **业务逻辑**: `AuthService.signup()`
|
||||
* 验证邮箱和验证码的有效性 (`VerificationCodeService`)。
|
||||
* 检查邮箱是否已注册 (`UserAccountRepository`)。
|
||||
* 对密码进行加密 (`PasswordEncoder`)。
|
||||
* 创建并保存新的 `UserAccount` 实体。
|
||||
|
||||
2. **登录 (`login`)**
|
||||
* **入口**: `AuthController.login()`
|
||||
* **业务逻辑**: `AuthService.login()`
|
||||
* 通过 Spring Security 的 `AuthenticationManager` 验证用户名和密码。
|
||||
* 如果认证成功,调用 `JwtService` 生成 JWT。
|
||||
* 返回包含 JWT 的响应给前端。
|
||||
|
||||
3. **访问受保护资源**
|
||||
* **安全过滤器**: `JwtAuthenticationFilter`
|
||||
* 拦截所有请求,从 `Authorization` 请求头中提取 JWT。
|
||||
* 验证 JWT 的有效性 (`JwtService`)。
|
||||
* 如果有效,从 JWT 中解析出用户信息,并构建一个 `UsernamePasswordAuthenticationToken`,设置到 Spring Security 的 `SecurityContextHolder` 中,完成授权。
|
||||
|
||||
#### 流程二:公众反馈与任务转化 (Feedback to Task)
|
||||
|
||||
**目标**:将公众通过开放接口提交的反馈(如环境问题)转化为系统内部的可追踪任务。
|
||||
|
||||
**执行路径**:
|
||||
|
||||
1. **提交反馈**
|
||||
* **入口**: `PublicController.submitFeedback()`
|
||||
* **业务逻辑**: `FeedbackService.createFeedback()`
|
||||
* 接收 `FeedbackDTO`,包含反馈内容和可选的附件。
|
||||
* 处理文件上传(如果存在),调用 `FileStorageService` 保存文件,并将附件信息与反馈关联。
|
||||
* 保存 `Feedback` 实体到数据库。
|
||||
|
||||
2. **反馈审核与任务创建 (由管理员操作)**
|
||||
* **入口**: `SupervisorController.approveFeedbackAndCreateTask()` (假设存在此接口)
|
||||
* **业务逻辑**: `SupervisorService.processFeedback()`
|
||||
* 管理员审核反馈内容。
|
||||
* 如果反馈有效,调用 `TaskManagementService.createTaskFromFeedback()`,基于反馈信息创建一个新的 `Task`。
|
||||
|
||||
#### 流程三:任务生命周期管理 (Task Lifecycle)
|
||||
|
||||
**目标**:完整地管理一个任务从创建、分配、执行到完成的全过程。
|
||||
|
||||
**执行路径**:
|
||||
|
||||
1. **任务创建**
|
||||
* **入口**: `TaskManagementController.createTask()`
|
||||
* **业务逻辑**: `TaskManagementService.createTask()`
|
||||
* 创建 `Task` 实体并设置初始状态(如 `PENDING_ASSIGNMENT`)。
|
||||
|
||||
2. **任务分配**
|
||||
* **入口**: `SupervisorController.assignTask()`
|
||||
* **业务逻辑**: `TaskAssignmentService.assignTaskToWorker()`
|
||||
* 将任务 (`Task`) 与一个网格员 (`GridWorker`) 关联起来,创建 `Assignment` 记录。
|
||||
* 更新任务状态为 `ASSIGNED`。
|
||||
|
||||
3. **任务执行与更新**
|
||||
* **入口**: `GridWorkerTaskController.updateTaskStatus()`
|
||||
* **业务逻辑**: `GridWorkerTaskService.updateTaskProgress()`
|
||||
* 网格员提交任务进度或结果,可附带图片等附件 (`FileStorageService`)。
|
||||
* 更新任务状态(如 `IN_PROGRESS`, `COMPLETED`)。
|
||||
|
||||
4. **任务审核与关闭**
|
||||
* **入口**: `SupervisorController.reviewTask()`
|
||||
* **业务逻辑**: `SupervisorService.reviewAndCloseTask()`
|
||||
* 主管审核已完成的任务。
|
||||
* 如果合格,将任务状态更新为 `CLOSED`。如果不合格,可打回 (`REJECTED`)。
|
||||
|
||||
#### 流程四:数据可视化与决策支持 (Dashboard & AI)
|
||||
|
||||
**目标**:为管理层提供数据洞察,并通过 AI 功能辅助决策。
|
||||
|
||||
**执行路径**:
|
||||
|
||||
1. **仪表盘数据**
|
||||
* **入口**: `DashboardController` 中的各个接口,如 `getTaskStats()`, `getRecentActivities()`。
|
||||
* **业务逻辑**: `DashboardService`
|
||||
* 调用多个 `Repository`(如 `TaskRepository`, `FeedbackRepository`)进行数据聚合查询,统计任务状态、反馈趋势等。
|
||||
* 返回 DTO 给前端进行图表展示。
|
||||
|
||||
2. **AI 辅助功能**
|
||||
* **文本审核**: `AiReviewService.reviewText()` 可能被用于自动审核反馈内容或评论,识别敏感信息。
|
||||
* **路径规划**: `AStarService.findPath()` 用于计算两点之间的最优路径,可辅助网格员规划任务路线。
|
||||
|
||||
### (二) 关键支撑机制
|
||||
|
||||
除了核心业务流程,系统还包含一系列关键的技术机制来保证其健壮、安全和可维护性。
|
||||
|
||||
1. **文件上传与管理**
|
||||
* **位置**: `FileStorageService`, `FileController`
|
||||
* **作用**: 提供统一的文件存储和访问服务。无论是用户头像、反馈附件还是任务报告,都通过此服务进行处理,实现了与具体存储位置(本地文件系统或云存储)的解耦。
|
||||
|
||||
2. **邮件与验证码服务**
|
||||
* **位置**: `MailService`, `VerificationCodeService`
|
||||
* **作用**: 负责发送邮件(如注册验证、密码重置)和管理验证码的生成与校验,是保障账户安全的重要环节。
|
||||
|
||||
3. **登录安全与尝试锁定**
|
||||
* **位置**: `LoginAttemptService`, `AuthenticationFailureEventListener`
|
||||
* **作用**: 监听登录失败事件 (`AuthenticationFailureListener`),并通过 `LoginAttemptService` 记录特定 IP 的失败次数。当超过阈值时,会暂时锁定该 IP 的登录权限,有效防止暴力破解攻击。
|
||||
|
||||
4. **A* 路径规划算法**
|
||||
* **位置**: `AStarService`, `PathfindingController`
|
||||
* **作用**: 实现了 A* 寻路算法,这是一个独立的功能模块,可以根据地图数据(网格 `Grid`)计算最优路径,为其他业务(如任务路线规划)提供支持。
|
||||
|
||||
5. **系统事件处理机制**
|
||||
* **位置**: `event` 和 `listener` 包
|
||||
* **作用**: 基于 Spring 的事件驱动模型,实现系统内各组件的解耦。例如,当一个用户注册成功后,可以发布一个 `UserRegistrationEvent` 事件,而邮件发送监听器 (`EmailNotificationListener`) 和新用户欢迎监听器 (`WelcomeBonusListener`) 可以分别监听并处理此事件,而无需在注册服务中硬编码这些逻辑。
|
||||
|
||||
6. **全局异常处理**
|
||||
* **位置**: `GlobalExceptionHandler`
|
||||
* **作用**: 捕获整个应用中抛出的未处理异常,并根据异常类型返回统一、规范的错误响应给前端。这避免了将原始的、可能包含敏感信息的堆栈跟踪暴露给用户,并提升了用户体验。
|
||||
|
||||
7. **自定义数据校验**
|
||||
* **位置**: `validation` 包 (如 `PasswordValidator`)
|
||||
* **作用**: 实现自定义的、复杂的校验逻辑。例如,`@ValidPassword` 注解可以确保用户设置的密码符合特定的强度要求(如长度、包含数字和特殊字符等)。
|
||||
|
||||
8. **数据持久化与查询 (JPA)**
|
||||
* **位置**: `repository` 包
|
||||
* **作用**: 利用 Spring Data JPA,通过定义接口 (`extends JpaRepository`) 的方式,极大地简化了数据库的 CRUD 操作和查询。开发者无需编写 SQL 语句,JPA 会自动根据方法名或注解生成相应的查询。
|
||||
|
||||
9. **API 数据契约 (DTO)**
|
||||
* **位置**: `dto` 包
|
||||
* **作用**: 数据传输对象 (Data Transfer Object) 是前后端分离架构中的关键实践。它作为 API 的“数据契约”,明确了接口需要什么数据、返回什么数据,实现了表现层与领域模型的解耦,使得双方可以独立演进,同时避免了敏感信息的泄露。
|
||||
|
||||
10. **应用配置与初始化**
|
||||
* **位置**: `config` 包, `DataInitializer`
|
||||
* **作用**: `config` 包集中管理了应用的所有配置类,如安全配置 (`SecurityConfig`)、Web 配置等。`DataInitializer` 则利用 `CommandLineRunner` 接口,在应用启动后执行一次性任务,如创建默认管理员账户、初始化基础数据等,确保了应用开箱即用的能力。
|
||||
* **密码加密**: 使用 `PasswordEncoder` 对用户密码进行加密,增强安全性。
|
||||
* **创建用户实体**: 创建一个新的 `UserAccount` 对象 (`Model`),并填充信息。
|
||||
|
||||
3. **Repository (数据访问层)**
|
||||
* **文件**: `com.dne.ems.repository.UserAccountRepository.java`
|
||||
* **方法**: `save(UserAccount user)`
|
||||
* **作用**: `AuthService` 调用此方法,将新创建的 `UserAccount` 对象持久化到数据库中。
|
||||
|
||||
4. **Model (领域模型)**
|
||||
* **文件**: `com.dne.ems.model.UserAccount.java`
|
||||
* **作用**: 定义了用户账户的数据结构,是数据库中 `user_accounts` 表的映射。
|
||||
|
||||
### 流程二:任务创建与分配
|
||||
|
||||
**目标**:主管或管理员根据一个已批准的反馈,创建一个新任务,并将其分配给一个网格员。
|
||||
|
||||
**执行路径**:
|
||||
|
||||
1. **Controller (表现层)**
|
||||
* **文件**: `com.dne.ems.controller.TaskManagementController.java`
|
||||
* **方法**: `createTaskFromFeedback(long feedbackId, TaskFromFeedbackRequest request)`
|
||||
* **作用**: 接收 `/api/management/tasks/feedback/{feedbackId}/create-task` POST 请求。它将反馈ID和任务创建请求 (`TaskFromFeedbackRequest` DTO) 传递给 Service 层。
|
||||
|
||||
2. **Service (业务逻辑层)**
|
||||
* **文件**: `com.dne.ems.service.impl.TaskManagementServiceImpl.java`
|
||||
* **方法**: `createTaskFromFeedback(long feedbackId, TaskFromFeedbackRequest request)`
|
||||
* **作用**: 实现核心的创建和分配逻辑:
|
||||
* **查找反馈**: 调用 `FeedbackRepository` 找到对应的 `Feedback` (`Model`)。
|
||||
* **查找负责人**: 调用 `UserAccountRepository` 找到指定的负责人 `UserAccount` (`Model`)。
|
||||
* **创建任务**: 创建一个新的 `Task` 对象 (`Model`),并从 `Feedback` 和请求 DTO 中填充任务信息(如描述、截止日期、严重性等)。
|
||||
* **设置状态**: 将任务的初始状态设置为 `ASSIGNED`。
|
||||
|
||||
3. **Repository (数据访问层)**
|
||||
* **文件**: `com.dne.ems.repository.TaskRepository.java`
|
||||
* **方法**: `save(Task task)`
|
||||
* **作用**: `TaskManagementService` 调用此方法,将新创建的 `Task` 对象保存到数据库。
|
||||
* **涉及的其他 Repository**: `FeedbackRepository` 和 `UserAccountRepository` 用于在业务逻辑中获取必要的数据。
|
||||
|
||||
4. **Model (领域模型)**
|
||||
* **文件**: `com.dne.ems.model.Task.java`
|
||||
* **作用**: 定义了任务的数据结构。
|
||||
* **涉及的其他 Model**: `Feedback.java` 和 `UserAccount.java` 作为数据来源。
|
||||
|
||||
### 流程三:网格员处理任务与提交反馈
|
||||
|
||||
**目标**:网格员查看自己的任务,执行任务,并提交处理结果(包括评论和附件)。
|
||||
|
||||
**执行路径**:
|
||||
|
||||
1. **Controller (表现层)**
|
||||
* **文件**: `com.dne.ems.controller.GridWorkerTaskController.java`
|
||||
* **方法**: `submitTask(long taskId, String comments, List<MultipartFile> files)`
|
||||
* **作用**: 接收 `/api/worker/{taskId}/submit` POST 请求。这是一个 `multipart/form-data` 请求,因为它同时包含了文本(评论)和文件。Controller 将这些信息传递给 Service 层。
|
||||
|
||||
2. **Service (业务逻辑层)**
|
||||
* **文件**: `com.dne.ems.service.impl.GridWorkerTaskServiceImpl.java`
|
||||
* **方法**: `submitTask(long taskId, String comments, List<MultipartFile> files)`
|
||||
* **作用**: 处理任务提交的业务逻辑:
|
||||
* **查找任务**: 调用 `TaskRepository` 找到当前需要处理的 `Task` (`Model`)。
|
||||
* **验证权限**: 确保当前登录的用户就是这个任务的负责人。
|
||||
* **处理文件上传**: 如果有附件,调用 `FileStorageService` 将文件保存到服务器,并创建 `Attachment` (`Model`) 对象。
|
||||
* **更新任务状态**: 将任务状态更新为 `SUBMITTED` 或 `PENDING_REVIEW`。
|
||||
* **保存评论和附件信息**: 将评论和附件信息关联到任务上。
|
||||
|
||||
3. **Repository (数据访问层)**
|
||||
* **文件**: `com.dne.ems.repository.TaskRepository.java`
|
||||
* **方法**: `save(Task task)`
|
||||
* **作用**: `GridWorkerTaskService` 在更新了任务状态和信息后,调用此方法将 `Task` 对象的变化持久化到数据库。
|
||||
* **涉及的其他 Repository**: `AttachmentRepository` (如果适用) 用于保存附件信息。
|
||||
|
||||
4. **Model (领域模型)**
|
||||
* **文件**: `com.dne.ems.model.Task.java`
|
||||
* **作用**: 任务数据在此流程中被更新。
|
||||
* **涉及的其他 Model**: `Attachment.java` 用于表示上传的文件。
|
||||
* **密码加密**: 使用 `PasswordEncoder` 对用户提交的明文密码进行加密,确保数据库中存储的是密文,保障安全。
|
||||
* **创建用户实体**: 创建一个新的 `UserAccount` (Model) 对象,并将注册信息(包括加密后的密码和角色)设置到该对象中。
|
||||
|
||||
3. **Service -> Repository (数据访问层)**
|
||||
* **文件**: `com.dne.ems.repository.UserAccountRepository.java`
|
||||
* **方法**: `save(UserAccount userAccount)`
|
||||
* **作用**: Service 层调用此方法,将填充好数据的 `UserAccount` 实体对象持久化到数据库中。Spring Data JPA 会自动生成对应的 SQL `INSERT` 语句来完成操作。
|
||||
|
||||
4. **返回结果**: 数据成功存入数据库后,操作结果会逐层返回,最终 `AuthController` 会向前端返回一个成功的响应消息。
|
||||
|
||||
### 流程二:任务的创建与自动分配
|
||||
|
||||
**目标**:系统管理员或主管创建一个新的环境问题任务,并由系统自动分配给相应网格内的网格员。
|
||||
|
||||
**执行路径**:
|
||||
|
||||
1. **前端 -> Controller (表现层)**
|
||||
* **文件**: `com.dne.ems.controller.TaskManagementController.java`
|
||||
* **方法**: `createTask(TaskCreateRequest taskCreateRequest)`
|
||||
* **作用**: 接收 `/api/tasks` POST 请求,请求体中包含了任务的详细信息(如描述、位置、图片附件ID等),封装在 `TaskCreateRequest` DTO 中。Controller 调用 `TaskManagementService` 来处理创建逻辑。
|
||||
|
||||
2. **Controller -> Service (业务逻辑层)**
|
||||
* **文件**: `com.dne.ems.service.impl.TaskManagementServiceImpl.java`
|
||||
* **方法**: `createTask(TaskCreateRequest taskCreateRequest)`
|
||||
* **作用**: 创建任务的核心业务逻辑。
|
||||
* 创建一个新的 `Task` (Model) 实体。
|
||||
* 根据请求中的附件ID,调用 `AttachmentRepository` 查找并关联附件。
|
||||
* 设置任务的初始状态为 `PENDING` (待处理)。
|
||||
* 调用 `TaskRepository` 将新任务保存到数据库。
|
||||
* **触发任务分配**: 保存任务后,调用 `TaskAssignmentService` 来执行自动分配逻辑。
|
||||
|
||||
3. **Service -> Service (业务逻辑层内部调用)**
|
||||
* **文件**: `com.dne.ems.service.impl.TaskAssignmentServiceImpl.java`
|
||||
* **方法**: `assignTask(Task task)`
|
||||
* **作用**: 处理任务的分配逻辑。
|
||||
* 根据任务的地理位置信息,调用 `GridRepository` 找到对应的地理网格 (`Grid`)。
|
||||
* 根据网格信息,调用 `UserAccountRepository` 找到负责该网格的网格员 (`GridWorker`)。
|
||||
* 如果找到合适的网格员,则更新 `Task` 实体的 `assignee` (执行人) 字段。
|
||||
* 更新任务状态为 `ASSIGNED` (已分配)。
|
||||
* 调用 `TaskRepository` 将更新后的任务信息保存回数据库。
|
||||
* (可选) 调用通知服务,向被分配的网格员发送新任务通知。
|
||||
|
||||
4. **Service -> Repository (数据访问层)**
|
||||
* **文件**: `com.dne.ems.repository.TaskRepository.java`, `com.dne.ems.repository.GridRepository.java`, `com.dne.ems.repository.UserAccountRepository.java`
|
||||
* **作用**: 在整个流程中,Service 层会频繁地与这些 Repository 交互,以查询网格信息、查询用户信息、保存和更新任务数据。
|
||||
|
||||
### 流程三:网格员处理任务并提交反馈
|
||||
|
||||
**目标**:网格员在完成任务后,通过 App 或前端页面提交任务处理结果,包括文字描述和现场图片。
|
||||
|
||||
**执行路径**:
|
||||
|
||||
1. **前端 -> Controller (表现层)**
|
||||
* **文件**: `com.dne.ems.controller.GridWorkerTaskController.java`
|
||||
* **方法**: `submitTaskFeedback(Long taskId, TaskFeedbackRequest feedbackRequest)`
|
||||
* **作用**: 接收 `/api/worker/tasks/{taskId}/feedback` POST 请求。路径中的 `taskId` 指明了要为哪个任务提交反馈,请求体 `TaskFeedbackRequest` DTO 中包含了反馈内容和附件ID。
|
||||
|
||||
2. **Controller -> Service (业务逻辑层)**
|
||||
* **文件**: `com.dne.ems.service.impl.GridWorkerTaskServiceImpl.java`
|
||||
* **方法**: `submitTaskFeedback(Long taskId, TaskFeedbackRequest feedbackRequest)`
|
||||
* **作用**: 处理网格员提交反馈的业务逻辑。
|
||||
* 调用 `TaskRepository` 检查任务是否存在以及当前用户是否有权限操作该任务。
|
||||
* 更新 `Task` 实体的状态为 `COMPLETED` (已完成) 或 `PENDING_REVIEW` (待审核)。
|
||||
* 创建一个新的 `Feedback` (Model) 实体,将反馈内容和关联的 `Task` 设置进去。
|
||||
* 调用 `FeedbackRepository` 将新的反馈信息保存到数据库。
|
||||
* 调用 `TaskRepository` 更新任务状态。
|
||||
|
||||
3. **Service -> Repository (数据访问层)**
|
||||
* **文件**: `com.dne.ems.repository.TaskRepository.java`, `com.dne.ems.repository.FeedbackRepository.java`
|
||||
* **作用**: `TaskRepository` 用于查询和更新任务信息,`FeedbackRepository` 用于保存新的反馈记录。
|
||||
|
||||
通过以上对核心业务流程的梳理,您可以清晰地看到,用户的每一个操作是如何触发后端系统中不同层、不同文件之间的一系列连锁反应,最终完成一个完整的业务闭环。这种清晰的、分层的架构是保证项目可维护性和扩展性的关键。
|
||||
73
ems-backend/target/classes/application.properties
Normal file
73
ems-backend/target/classes/application.properties
Normal file
@@ -0,0 +1,73 @@
|
||||
spring.application.name=ems-backend
|
||||
|
||||
# ===================================================================
|
||||
# 移除数据库相关配置,使用JSON文件存储
|
||||
# ===================================================================
|
||||
|
||||
file.upload-dir=./uploads
|
||||
# A secure key for signing JWT tokens.
|
||||
# This should be a long, random, Base64-encoded string.
|
||||
# For production, this should be stored securely (e.g., as an environment variable).
|
||||
token.signing.key=${TOKEN_SIGNING_KEY:dev-change-me}
|
||||
|
||||
# ===================================================================
|
||||
# c. Volcano Engine AI Service Configuration
|
||||
# ===================================================================
|
||||
volcano.api.url=https://ark.cn-beijing.volces.com/api/v3/chat/completions
|
||||
volcano.api.key=${VOLCANO_API_KEY:}
|
||||
volcano.model.name=deepseek-v3-250324
|
||||
|
||||
# ===================================================================
|
||||
# d. Spring AOP Configuration
|
||||
# ===================================================================
|
||||
# Force the use of CGLIB proxies for AOP
|
||||
spring.aop.proxy-target-class=true
|
||||
|
||||
# ===================================================================
|
||||
# e. Application Base URL
|
||||
# ===================================================================
|
||||
# This URL is used to construct absolute URLs for resources like uploaded files.
|
||||
# It should be the public-facing base URL of the application.
|
||||
app.base.url=${APP_BASE_URL:http://localhost:5173}
|
||||
|
||||
# ===================================================================
|
||||
# Mail Configuration for 163 SMTP
|
||||
# ===================================================================
|
||||
spring.mail.host=smtp.163.com
|
||||
spring.mail.port=465
|
||||
spring.mail.username=${SPRING_MAIL_USERNAME:}
|
||||
spring.mail.password=${SPRING_MAIL_PASSWORD:}
|
||||
spring.mail.properties.mail.smtp.auth=true
|
||||
spring.mail.properties.mail.smtp.ssl.enable=true
|
||||
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
|
||||
spring.mail.properties.mail.smtp.socketFactory.fallback=false
|
||||
spring.mail.properties.mail.smtp.socketFactory.port=465
|
||||
spring.mail.properties.mail.transport.protocol=smtp
|
||||
spring.mail.properties.mail.debug=true
|
||||
|
||||
# ===================================================================
|
||||
# Server Configuration
|
||||
# ===================================================================
|
||||
server.port=8080
|
||||
|
||||
# ===================================================================
|
||||
# Logging Configuration
|
||||
# ===================================================================
|
||||
logging.level.root=INFO
|
||||
logging.level.com.dne.ems=DEBUG
|
||||
logging.level.org.springframework.web=INFO
|
||||
logging.level.org.hibernate=WARN
|
||||
|
||||
# ===================================================================
|
||||
# JWT Configuration
|
||||
# ===================================================================
|
||||
jwt.secret=${JWT_SECRET:dev-change-me}
|
||||
jwt.expiration=86400000
|
||||
|
||||
# ===================================================================
|
||||
# Spring Task Configuration
|
||||
# ===================================================================
|
||||
spring.task.execution.pool.core-size=5
|
||||
spring.task.execution.pool.max-size=10
|
||||
spring.task.execution.pool.queue-capacity=25
|
||||
spring.task.execution.thread-name-prefix=ems-async-
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
ems-backend/target/classes/com/dne/ems/dto/AssigneeInfoDTO.class
Normal file
BIN
ems-backend/target/classes/com/dne/ems/dto/AssigneeInfoDTO.class
Normal file
Binary file not shown.
BIN
ems-backend/target/classes/com/dne/ems/dto/AttachmentDTO.class
Normal file
BIN
ems-backend/target/classes/com/dne/ems/dto/AttachmentDTO.class
Normal file
Binary file not shown.
BIN
ems-backend/target/classes/com/dne/ems/dto/CityBlueprint.class
Normal file
BIN
ems-backend/target/classes/com/dne/ems/dto/CityBlueprint.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
ems-backend/target/classes/com/dne/ems/dto/FeedbackDTO.class
Normal file
BIN
ems-backend/target/classes/com/dne/ems/dto/FeedbackDTO.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
ems-backend/target/classes/com/dne/ems/dto/GridCoverageDTO.class
Normal file
BIN
ems-backend/target/classes/com/dne/ems/dto/GridCoverageDTO.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
ems-backend/target/classes/com/dne/ems/dto/HeatmapPointDTO.class
Normal file
BIN
ems-backend/target/classes/com/dne/ems/dto/HeatmapPointDTO.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
ems-backend/target/classes/com/dne/ems/dto/LoginRequest.class
Normal file
BIN
ems-backend/target/classes/com/dne/ems/dto/LoginRequest.class
Normal file
Binary file not shown.
Binary file not shown.
BIN
ems-backend/target/classes/com/dne/ems/dto/OperationLogDTO.class
Normal file
BIN
ems-backend/target/classes/com/dne/ems/dto/OperationLogDTO.class
Normal file
Binary file not shown.
BIN
ems-backend/target/classes/com/dne/ems/dto/PageDTO.class
Normal file
BIN
ems-backend/target/classes/com/dne/ems/dto/PageDTO.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
ems-backend/target/classes/com/dne/ems/dto/Point.class
Normal file
BIN
ems-backend/target/classes/com/dne/ems/dto/Point.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
ems-backend/target/classes/com/dne/ems/dto/SignUpRequest.class
Normal file
BIN
ems-backend/target/classes/com/dne/ems/dto/SignUpRequest.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
ems-backend/target/classes/com/dne/ems/dto/TaskDTO.class
Normal file
BIN
ems-backend/target/classes/com/dne/ems/dto/TaskDTO.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
ems-backend/target/classes/com/dne/ems/dto/TaskDetailDTO.class
Normal file
BIN
ems-backend/target/classes/com/dne/ems/dto/TaskDetailDTO.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user